接下来的坑是排序算法,首先给出几个以后都用得上的名词:
- 时间复杂度:一个程序对n个数据需要的时间,考虑为n的函数
- 空间复杂度:定义同上,不过是对空间
上述两个一般只取n的函数的最高阶无穷小并且忽略倍数,如2n3+n2+5取n3即可; - 稳定/不稳定:是否交换了不需要交换的序列,
检验方式为观看两个相等的数据(a[i]=a[j],其中i<j)在排序后相对顺序不变的为稳定
比如121先交换两个1,然后交换成112(纯属口嗨,应该是没怎么皮的排序方式,但不稳定的算法还是有的)
基本算法
冒泡排序
又叫气泡,意思是模拟气泡在水中上升的过程。
(这个图是从最后一行看起的。。。)
假设写小的一端为水面,第一个处理的数据为2(最右边),然后不断和之前面的比较,交换;
然后再从最后一个元素开始:
但这次的比较少了一个,因为第一轮选择出来的元素一定是这里面最小的,所以不必比较;
重复上述过程,每一次减少一个元素,一共要四轮(总数减一,因为最后一个元素不必比较)
可能细心的你已经发现了,在第三轮交换结束后,得到的就是一个有序序列了,此时完全可以结束程序,所以我们还需要一个判断,及时停止程序。
void bubble(int *a,int length)//a[length]为从0到length-1都存储数据的数组
{
int temp,sum=1;
while(sum)
{
sum=0;//设置标记位减少不必要的排序
for(int i=1;i<length;i++)
{
if(a[i-1]>a[i])
{
temp=a[i-1];
a[i-1]=a[i];
a[i]=temp;
sum=1;
}
}//for
}