常见的排序算法
稳定性:就是比如统计考试成绩排名时:两个人同时都考了90分,要按照谁先交卷谁排在前面.这样就叫稳定;反之,两个人都考90分,让后交卷的人排在先交卷的人前面就是不稳定.
1.直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到
一个新的有序序列 。实际中我们玩扑克牌时,就用了插入排排序的思想.
比如给出一组数字:5 10 3 8 2
直接插入排序:j = i-1;单独拿出i 和 j 比较,如果j 比i 大,就把j 的值放在i 的位置,j继续向前移,然后j 的值和i 的值比较
public class TestSort{
public static void insertSort(int[] array){
for(int i = 1;i<array.length;i++){
int tmp = array[i];
int j = i-1;
for(;j>=0;j--){
if(array[j]>tmp){
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = tmp;
}
}
public static void main(String[] args){
int[] array = {5,10,3,8,2};
System.out.println("排序前:"+Arrays.toSring(array));
insertSort(array);
System.out.println("排序后:"+Arrays.toSring(array));
}
}
时间复杂度:最坏情况O(n^2);(就是逆序的情况下:5 4 3 2 1 j要回退n次(分别回退1,2,3,4,5次),i也回退n次)
最好情况下O(n);
[直接插入排序的使用场景:当数据量小,并且已经趋向于有序的时候,使用直接插入排序]
空间复杂度:O(1);
稳定性:稳定的排序
2.希尔排序:缩小增量的排序:
(1.) 希尔排序是对直接插入排序的优化。
(2.)当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
(3.)希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在
好些树中给出的希尔排序的时间复杂度都不固定;
public static void shell(int[] array,int gap){
for(int i = gap;i<array.length;i++){
int tmp = array[i];
int j = i-gap;
for(;j>=0;j-=gap){
if(array[j]>tmp){
array[j+gap] = array[j];
}else{
break;
}
}
array[j+gap] = tmp;
}
}
public static void shellSort(int[] array){
int gap = array.length;
while(gap>1){
shell(array,gap);
gap/=2;
}
shell(array,1);
}
不稳定排序
3. 选择排序:
public static void selectSort(int[] array){
for(int i = 0;i<array.length;i++){
int minIndex = i;
for(int j = i+1;j<array.length;j++){
if(array[j]<array[minIndex]){
minIndex = j;
}
}
int tmp=array[i];
array[i] = array[j];
array[j] = tmp;
}
}
时间复杂度:O(n^2)
不稳定(如果有跳跃式的交换,一般来说不稳定)
4.堆排序
下面是堆排序,指的是在这个数组里,从左到右按 从大到小排,写小根堆.如果要从小到大排序,就写大根堆,最后heapsort里end和0交换,
5.冒泡排序
public static void bubbleSoret(int[] array){
for(int i=0;i<array.length-1;i++){
boolean flg = false; //优化
for(int j=0;j<array.length-1-i;i++){
if(array[j]>array[j+1]){
int tmp=array[j];
array[j] = array[j+1];
array[j+1] = tmp;
flg = true; //优化
}
}
if(!flg){ //优化
break;
}
}
总结: