1.
冒泡法:每一次排序过程,通过相邻元素的两两交换,将当前没有排好序中的最大数移到数组的最右端。
代码如下:
void bubble(int a[ ],int n)
{
int i,j,t;
for(i=0;i<n-1;i++) //这里的i仅用作大循环的次数,大循环9次,因为最后一个数自动冒顶
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
2.选择法::每一次排序过程,我们获取当前没有排好序中的最小的元素和数组最左端的元素交换,循环这个过程即可实现对整个数组排序。
数组最左端的元素是变化的(没排好序的),因此外循环用来确定最左端元素(的下标),而非如冒泡法的外循环仅用来计数大循环。
还需要一个值用来存放最小值的下标。通过比较、替换,把最小数的下标存在这个变量中(但不进行数的交换),当比较完无序数组后,我们得到这组无序数组最小值的下标值,通过这个下标把最小的元素和无序数组最左端的元素交换。
void sort(int a[],int n)
{
int i,j,k,t;
for(i=0;i<9;i++)
{
k=i; //先默认最小值的下标就是i
for(j=i+1;j<10;j++)
{
if(a[j]<a[i])
{
k=j;
}
}
t=a[k]; //通过这个下标,我们把最小的元素和数组最左端的元素(未排序的)交换
a[k]=a[i];
a[i]=t;
}
}
3.实际上,以下代码也是可以实现同样功能的
void sort(int a[],int n)
{
int i,j,t;
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(a[j]<a[i])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
4.
排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 |
冒泡 | O(n2) | O(n2) | 稳定 | O(1) | n小时较好 |
交换 | O(n2) | O(n2) | 不稳定 | O(1) | n小时较好 |
选择 | O(n2) | O(n2) | 不稳定 | O(1) | n小时较好 |
插入 | O(n2) | O(n2) | 稳定 | O(1) | 大部分已排序时较好 |
基数 | O(logrd) | O(logrd) | 稳定 | O(n) | d是关键字项数(0-9), r是基数(个十百) |
Shell | O(nlogn) | O(ns) 1<s<2 | 不稳定 | O(1) | s是所选分组 |
快速 | O(nlogn) | O(n2) | 不稳定 | O(nlogn) | n大时较好 |
归并 | O(nlogn) | O(nlogn) | 稳定 | O(1) | n大时较好 |
堆 | O(nlogn) | O(nlogn) | 不稳定 | O(1) | n大时较好 |