(1) 插入排序算法:
void Insert_sort(int *Arr,int n)//Arr是数组名,n表示数组长度。
{
int i,j,k;
for(i=1;i<n;i++) //注释1
{
k = Arr[i];
j = i-1;
while(j>=0 && k<Arr[j]) //注释2
{
Arr[j+1] = Arr[j];
j--;
}
Arr[j+1] = k;
}
return;
}
《算法导论》中对这种算法举了一个十分生动的例子:就像打牌的时候,按照牌的大小排序时,刚发到手的那张牌会跟手里已经排好序的一个一个比较,然后找到一个最适合的插入点。当然此算法是原地排序(sorted in place,就是在一个数组中完成排序工作),确定插入点的思路是(假设是从小到大排序):如果当前数据比它前一个数小那么把当前值先保存到一个缓存变量里面,然后将它前面的那个数往后移动一次,然后并将当前值与下一个数比较直到找到一个比缓存变量值小的数为止,然后将缓存变量值放到该值的后面(程序里注释2)。至于注释1,是要保证遍历完全部数组。
(2)选择排序算法:
//默认从小到大排序
/*选择排序算法:它的基本思想是每遍历一遍数列选择出最小(大)值放到前面*/
void Selection_sort(int *Arr,int n)
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)//注释3
{
if(Arr[j]<Arr[i])//如果中间某元素比开头的数小,那就替换二者,选择最小的放到最先面
{
k = Arr[i];
Arr[i] = Arr[j];
Arr[j] = k;
}
}
}
return;
}
程序里已经说明了该算法的基本思路,这里说一下注释3,这个地方的子层循环开始的地方不是数组0位置,原因是前面已经挑出了i个已经排好序的数据了。此算法与插入排序算法相比,区别在于前者一个一个将”新“元素放到合适的位置,后者是确定好位置(比如当前位置该放第几小的数据),然后选出最佳值。
(3) 冒泡排序算法:
void Bubble_sort(int *Arr,int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(Arr[j]>Arr[j+1])
{
k = Arr[j];
Arr[j] = Arr[j+1];
Arr[j+1] = k;
}
}
}
return;
}
冒泡排序的基本思路就是:遍历每一个数组都将较小的值放到前面(假设是从小到大排序),直到完成排序任务,数学上可以证明n个数需要比较 n ( n − 1 ) n(n-1) n(n−1)次。
小结:三种算法的时间复杂度都是 O ( n 2 ) O(n^2) O(n2)。