1.选择排序
思想:在第i次循环中,找出后N-i个元素的最小值,并放在第i个元素的位置上,实现递增的排序。
JAVA实现代码:
public static void sort(Comparable[] a)
{ int N = a.length;
for(int i=0;i<N;i++){
int min = i;
for(int j=i+1;j<N;j++)
if(less(a[j],a[min])) min = j;
exch(a,i,min);
}
}
其中 less函数的作用是判断a[j]是否小于a[min],exch函数的作用是交换数组a[]中第i与第min个的位置。
从上可以看出,当使用选择排序时,不论待排数组初始顺序如何,算法都要进行((N-1 ) +(N-2) + ... +1)=N*(N-1) /2 ~N平方/2 次比较 和 N次交换。
2.插入排序
思想: 想象有一副扑克,现要将扑克排序,左手中拿的已排好序的部分扑克,右手拿待排序的扑克每次添加一张牌来按顺序排好,每有一个新排进行排序时,都要按左手扑克的次序进行比较,插入到适当位置。
JAVA实现代码:
public static void sort(Comparable[] a)
{ int N = a.length;
for(int i=1;i<N;i++){
for(int j = i;j >0&&less(a[j],a[j-1]);j--)
exch(a,i,j);
}
}
less 与 exch 函数作用同上。
这段代码可以这么理解:插入n-1次新值,每次插入值时向前进行比较(由于前面的数字是有序的,当不满足less(a[j],a[j-1])时,j的值再减小也不会再满足),插入到合适的位置。
从上可以看出,当使用(直接)插入排序时,对于主键不重复的数组,最坏的情况需要((N-1 ) +(N-2) + ... +1)=N*(N-1) /2 ~N平方/2 次比较 和交换。最好情况下需进行N-1次比较和0次交换。所以平均情况需进行N平方/4次比较和交换。
3.希尔排序
思想:按照某一递增序列的大小对数组进行分组,对分组后的数组进行插入排序。是一种对插入排序的改进,使大数组可以先变为局部有序的小数组之和,再进行插入排序。
JAVA实现代码:
public static void sort(Comparable[] a){ int N = a.length;
int h = 1;
while(h<N/3) h = 3*h+1; //建立递增序列 while(h>=1){
for(int i=h;i<N;i++){
for(int j = i;j>=h&&less(a[j],a[j-h]);j-=h)
exch(a,j,j-h);
}
} }
不是重点作为了解