排序1: 冒泡排序及其优化
一. 概述
(1)冒泡 排序是一种 排序是一种 排序是一种 交换 排序。
交换排序:数据两两比较,交换不满足次序要求的数据,直到整组数据都满足排序要求。
二.算法思想
假设有一个大小为 N 的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。
假设有一个无序序列: 4,3,1,2,5
三.时间复杂度 和 空间复杂度
冒泡排序就是把小的元素往前调或者把大的元素往后调。当数据越接近正序,冒泡排序性能越好。
比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,
所以冒泡排序是一种稳定排序算法。
/*
Data:2018/12/26
code: bubble sort
From:mohican
*/
#include<stdio.h>
//普通冒泡排序 两两交换
//降序排列
void Bubble(int *arr,int len)
{
int temp = 0;
int num =0;
for(int i = 0 ;i<len-1;++i) //最后一个元素 位置 i i+1越界
{
for(int j =0 ;j<len-1;++j)
{
if(arr[j]>arr[j+1])
{
temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
//冒泡排序优化
//设置一个flag 如果不再发生交换,说明已经有序,不再需要排序,直接退出
void BubbleBetter(int *arr,int len)
{
int temp = 0;
int num =0;
bool flag = false;
for(int i = 0 ;i<len-1;++i) //最后一个元素 位置 i i+1越界
{
flag =false;
for(int j =0 ;j<len-1;++j)
{
if(arr[j]>arr[j+1])
{
temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
flag = true;
}
if(!flag)
{
return ;
}
}
}
void show(int *arr,int len)
{
for(int i =0;i<len;++i)
{
printf("%d\t",arr[i]);
}
}
int main()
{
int arr[]={7,3,4,6,4,2.876,3,5346,345};
int len = sizeof(arr)/sizeof(arr[0]);
Bubble(arr,len);
BubbleBetter(arr,len);
show(arr,len);
getchar();
return 0;
}