常见排序算法
[COT]
1、冒泡排序
import java.util.Random; public class ownTest { //将数组 array 中 begin 和 end 两个位置的值交换 public void swap(int[] array,int begin,int end){ int temp; temp = array[begin]; array[begin] = array[end]; array[end] = temp; } public void showArray(int[] array,int begin,int end,boolean start){ System.out.println("排序"+(start?"前:":"后:")); int count=0; for (int i=begin;i<=end;i++) { System.out.print(array[i]+"\t"); if (++count%10==0) { System.out.println(); } } } public int[] getRandArray(int size){ Random rand = new Random(); final int SEED =13;//随便赋值 int[] array =new int[size]; for (int i = 0; i < array.length; i++) { array[i]=rand.nextInt(size*SEED); } return array; } //冒泡排序 public void _bubbleSort(int[] array,int begin,int end){ //控制比较的轮次 for (begin=0;begin<end;end--){ //控制每轮比较次数 for (int j=begin;j<end;j++){ if (array[j]>array[j+1]){ swap(array,j,j+1); } } } } public void bubbleSort(int[] array,int begin,int end){ showArray(array,begin,end,true); _bubbleSort(array,begin,end); showArray(array,begin,end,true); } public static void main(String[] args) { ownTest a = new ownTest(); int[] array = a.getRandArray(10); a.bubbleSort(array,0,array.length-1); } }
2、选择排序
public void selectSort(int[] array,int begin,int end){ //控制比较的轮次 for (int maxValIx;begin<end;end--){ maxValIx=begin; //控制每轮比较次数 for (int j=begin+1;j<=end;j++){ //不用和自己比,得走到最后一个位置才可 if (array[j]>array[maxValIx]){ maxValIx=j; } } //如果最大值没有出现在最大位置,则交换 if (maxValIx!=end){ swap(array,maxValIx,end); } } } public void _insertSort(int[] array,int begin,int end){ for (int i = begin+1,t,j; i <=end ; i++) { t=array[i]; if (t>=array[i]) continue; for (j=i-1;j>=begin&&array[j]>t;j--){ array[j+1]=array[j]; } array[j+1]=t; } }
3、插入排序
public void _insertSort(int[] array,int begin,int end){ for (int i = begin+1,t,j; i <=end ; i++) { /end是下标,不是长度 t=array[i]; //当前位置左侧有序,如果当前位置的值比左侧第一位大,向后走一步 if (t>=array[i])continue; //否则向左移找到一个比当前小的值所在位置,所有比当前位置大的都右移一位 for (j =i-1;j>=begin && array[j]>t ;j--){//如果array[j]当中存在比t大的值 array[j+1] = array[j]; } //最后将值插入该位置右边一位 array[j+1]=t; } } public void insertSort(int[] array,int begin,int end){ showArray(array,begin,end,true); _insertSort(array,begin,end); showArray(array,begin,end,false); }
![]()
4、希尔排序
//希尔排序 public void hillSort(int[] array,int begin,int end){ showArray(array,begin,end,true); int step = (end - begin +1)/2 ; //0-5共6个元素 中间是 while (step>=1){ for (int i = begin; i +step<=end; i++) { //i+step的值不能越界 if (array[i] > array[i+step]) { swap (array,i,i+step); } } step /=2; } _insertSort(array,begin,end); showArray(array,begin,end,false); }
5、快速排序(掌握)
快速排序(不稳定,如果第一个是最小的情况的话,分不出来)
详情看:1.6 快速排序 | 菜鸟教程 (runoob.com)
//找到begin和end相遇的下标。 private int mid(int[] array,int begin,int end){ int mid = begin; while (begin<end){ while (begin<end && array[end]>=array[mid]) end--; while (begin<end && array[begin]<=array[mid]) begin++; //当两个循环结束(左边较小的,右边较大的)还没出现等于,交换 if (begin<end) { swap(array, begin, end); } } if (mid != begin){//begin和end一样大 swap(array,mid,begin); } return begin; } public void _quickSort(int[] array,int begin,int end){ if (begin>= end) { return; } int mid = mid(array,begin,end); _quickSort(array,begin,mid-1); _quickSort(array,mid+1,end); } public void quickSort(int[] array,int begin,int end){ showArray(array,begin,end,true); _quickSort(array, begin, end); showArray(array,begin,end,false); }
![]()
6、归并排序(掌握)
//因为会不断返回一个新数组 private int[] _mergeSort(int[]array,int begin, int end){ if (end-begin==0){ return new int[]{array[begin]};//begin和end都一样的 } int m =begin + (end - begin)/2,l=0,r=0;//中间的下标m =(end + begin)/2;可能会越界 int[] left = _mergeSort(array,begin,m); int[] right = _mergeSort(array,m+1,end); //先拆成一个一个,再归并回去 //定义一个两个下标加起来的数组 int[] temp = new int[left.length+right.length]; m=0; while (l<left.length && r<right.length){ temp[m++] = left[l]<right[r]?left[l++]:right[r++]; } while (l<left.length){ temp[m++] = left[l++]; } while (r<right.length) { temp[m++] = right[r++]; } return temp; } public int[] mergeSort(int[] array,int begin,int end){ showArray(array,begin,end,true); array=_mergeSort(array, begin, end); showArray(array,begin,end,false); return array; }

浙公网安备 33010602011771号