简单排序是指运行时间为O(n*n)的排序算法,将这三种排序整合到一起更有利于对比三者之间的区别,更有助于更深刻地理解各算法内的思路。
1冒泡排序
这种算法的思路和实现最简单粗暴,原因在于该算法基于一种数学原理,也可以说常识:按照单一增减性连续地交换元素,最终或者最后一个元素不是最大就是最小。但难点在于循环终点的计算,按照我的思维习惯,最初的思维落在内循环的结点上。只要确定内外循环终点之间的关系该算法即可实现。以下为C语言实现代码:
void bubblesort(int array[],int n){
int i,j,m;
int temp;
for (i = 0; i < n-1; ++i)
{
for(j=0;j<n-i-1;j++)
if(array[j]>array[j+1])
swapdata(&array[j],&array[j+1]);
}
}
2插入排序
该算法的技巧性更强。不过从效果上看,技巧性也带来了性能上的提升,该算法在二次时间界上应用最为广泛,并且在少量输入的情况下,运行速度并不亚于其他高级排序算法。如果n在10左右,建议使用该算法。
void insert_sort(int array[],unsigned int n){
int i,j,m;
int temp;
for(i=1;i<n;i++){
temp=array[i];
for(j=i;j>0&&array[j-1]>temp;j--){
array[j]=array[j-1];
}
array[j]=temp;
}
}
3 选择排序
选择排序的思路是在待排数组内将最小的元素置于首位,然后在原数组除了首位元素外看作新的待排数组,直至到最后的元素即为完成排序。以下为代码实现:
void select_sort(int array[],int n){
int i,j,m;
int temp;
for(i=0;i<n;i++){
int index=i;
for(j=i+1;j<n;j++)
if(array[j]<array[index])
index=j;
if(index!=i){
swapdata(&array[index],&array[i]);
}
}
}
总结:三种排序的外部循环的初始状态出插入循环外都是从0开始,当然这也是与内部循环的方向有关系,因为内部循环也只有插入排序 为递减;外循环的临界条件只有冒泡排序为n-1,原因在于后续比较是以前比后的方式,所以要预留出最后一个元素作为比较空间,同时也解释了插入排序的外循环的初始条件为什么从一开始,因为它采用的是以后比前的方式,要预留出第一个元素作为比较空间,冒泡排序比较特殊的是内循环的临界条件,是与外循环的初始状态呈递减的线性关系,即两者的和为定值。三种排序算法只有插入排序看起来没有使用交换元素的方式,其实在内循环的输出就是交换里的一步,只不过这一步是动态的,这也是插入排序较难理解的一个点所在。