一.总览
二.基于比较的排序算法
1.简单插入排序(重点)
注意:区间较小时,最快
原理:
一组数据array[],认为以下标i为分界,[0,i+1)认为有序,[i+1,array.length)无序,从无序数据中每次取出一个数据,插入有序数据中
代码实现:
public static void insertSort(long []array){
//数据一共有array.length个
//所以,子操作需要执行array.length次
//减不减一都可以,减一认为第一个数已经有序
for (int i = 0; i <array.length-1 ; i++) {
//有序[0,i+1) 例如刚开始[0,1)有序
//无序[i+1,array.length)
//抓取出来的数是[i+1]
long key=array[i+1];
int j=0;
//依次在有序区间进行比较
for ( j = i; j>=0 ; j--) {
//[j]就是需要和key比较的数
/**
* key<array[j] 把array[j]往后移 继续往前比较
* key==array[j] 把key放入array[j]的后边
* key>array[j] 把key放入array[j]的后边
*/
if(key<array[j]){
array[j+1]=array[j];
}else {
break;
}
}
array[j+1]=key;
}
}
性能分析:
2.冒泡排序(重点)
原理:
在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序
无序区间:[0,array,length-i)
有序区间:[array.length-i,array.length)
从下标j开始,将其与下标j+1依次比较,如果大于,交换。
代码实现:
public static void bubblingSort(long []array){
//外层循环,需要多少次冒泡的过程
for (int i = 0; i <array.length ; i++) {
//无序区间:[0,array,length-i)
//有序区间[array.length-i,array.length)
//假设数组已经有序
boolean isSorted=true;
//冒泡过程
//只在无序区间中进行
//循环到无序区间的倒数第二个数,然后倒数第二会和倒数第一再比较
for (int j = 0; j <array.length-i-1 ; j ++) {
if(array[j]>array[j+1]){
swap(array, j, j+1);
//交换过,说明数组无序
isSorted=false;
}
}
//如果数组有序,退出循环
if(isSorted){
break;
}
}
}
public static void swap(long []array,int i,int j){
long t=array[i];
array[i]=array[j];
array[j]=t;
}
性能分析: