6大排序算法—老生常谈的问题,我却不精通
很遗憾虽然排序算法作为最基本的算法,然而我自以为我也会这种算法,但是我忽略的一个事实,我只知道这种算法的思想,真正实现或者使用的次数却屈指可数。但是我一直认为我是会的……,直到有一天,有人给我一张纸说,来写个快排吧,
于是有了这篇排序算法总结
- 选择排序
核心思想是每次从剩余的数中选择最小或最大的数,核心操作是需要一个变量来存储,每一次更新过程,最后返回找到的最小(大)的数下标,然后把这个数和应该放在某个位置上原有的数进行交换
public void selection(int [] a){
int N=a.length;
for(int i=0;i<N;i++){
int min=i;
for(int j=i+1;j<N;j++){
if(a[j]<a[min]){
min=j;
}
}
swap(a[i],a[min]);
}
}
- 插入排序
核心思想:每次插入一个数据前,数组是有序的,只需要把数据插在有序的数组的部分位置。
public void insertion(int[] a){
int N=a.length;
for(int i=1;i<N;i++){
for(int j=i;j>0&&a[j]<a[j-1];j--){
swap(a[j],a[j-1]);
}
}
}
- 希尔排序
核心思想:希尔排序是插入排序的改进版,插入排序中,每次一个数据只能和临近位置的数据交换,换句话说,每次一个数据只能移动一个位置,如果一个最小的数在数组最后,那么他需要执行N-1次交换。
希尔排序利用散列的思想,创造h路独立的插入排序,这样当h很大时,会增大数据一次可以移动的距离,这样当随着h减小时,这将有利于h小的插入排序(减少移动交换次数),最后h取1 ,就是一个插入排序。
public void shellsort(int [] a){
int N=a.length;
int h=1;
while(h<N/3){
h=h*3+1;
}
while(h>=1){
for(int i=h;i<N;i++){
for(int j=i;j>=h&&a[j]<a[j-h];j-=h){
swap(a[j],a[j-h])
}
}
h=h/3;
}
}
归并排序
快速排序
- 3路快排
堆排序