插入排序、合并排序、堆排序和快速排序
1 * 插入排序 2 * 时间复杂度O(n2) 3 * @param array原地排序算法 4 */ 5 public void insertSort(int[] array) { 6 for (int i = 1; i < array.length; i++) { 7 int present = array[i]; 8 int position = i; 9 while (position > 0 &;&; array[position - 1] > present) {// 右移 10 array[position] = array[position - 1]; 11 position--; 12 } 13 array[position] = present; 14 } 15 } 16 17 18 19 /** 20 21 * 合并排序 22 * O(nlogn) 23 * @param array 24 * @param left 第一个索引 25 * @param right 最后一个索引 26 */ 27 public void mergeSort(int []array,int left,int right){ 28 if(left<right){ 29 int middle=(left+right)/2; 30 mergeSort(array,left,middle); 31 mergeSort(array,middle+1,right); 32 merge(array,left,middle,right); 33 } 34 } 35 36 public void merge(int []array,int left,int middle,int right){ 37 int [] array1=new int[middle-left+1]; 38 int [] array2=new int[right-middle]; 39 for(int i=0;i<array1.length;i++){ 40 array1[i]=array[left+i]; 41 } 42 for(int i=0;i<array2.length;i++){ 43 array2[i]=array[middle+i+1]; 44 } 45 int l=0,r=0,k=left; 46 for(;k<=right&;&;l<array1.length&;&;r<array2.length;k++){ 47 if(array1[l]>array2[r]){ 48 array[k]=array2[r]; 49 r++; 50 }else { 51 array[k]=array1[l]; 52 l++; 53 } 54 } 55 while(l<array1.length){ 56 array[k]=array1[l]; 57 l++; 58 k++; 59 } 60 while(r<array2.length){ 61 array[k]=array2[r]; 62 r++; 63 k++; 64 } 65 } 66 67 68 69 /** 70 * 堆排序 71 * 原地排序且O(nlogn) 72 * @param array 73 */ 74 public void heapSort(int [] array){ 75 buildHeap(array); 76 for(int i=array.length-1;i>0;i--){ 77 int k=array[0]; 78 array[0]=array[i]; 79 array[i]=k; 80 heapify(array, 0, i); 81 } 82 } 83 /** 84 * 构建最大堆 85 * @param array 86 */ 87 public void buildHeap(int [] array){ 88 for(int i=array.length/2-1;i>-1;i--){ 89 heapify(array,i,array.length); 90 } 91 } 92 93 /** 94 * 95 * @param array 数组 96 * @param index 数组中的索引 97 * @param length 树中元素个数 98 */ 99 public void heapify(int [] array,int index,int length){ 100 int present=index;//当前索引 101 int value=array[index]; 102 int largest=array[index]; 103 int largest_index=index; 104 while((2*present+1)<length){//判断是否有儿子 105 if(array[2*present+1]>largest){ 106 largest=array[2*present+1]; 107 largest_index=2*present+1; 108 } 109 if((2*present+2)<length&;&;array[2*present+2]>largest){ 110 largest=array[2*present+2]; 111 largest_index=2*present+2; 112 } 113 if(largest_index!=present){ 114 array[present]=largest; 115 present=largest_index; 116 largest=value; 117 }else{ 118 break; 119 } 120 } 121 array[present]=value; 122} 123 124 125 126 /** 127 * 最坏时间O(n2)----在数组已经排好序时发生 128 * O(nlogn) 129 * @param array 130 * @param p 131 * @param r 132 */ 133 public void quickSort(int []array,int p,int r){ 134 if(p<r){ 135 int q=partition(array,p,r); 136 quickSort(array,p,q-1); 137 quickSort(array,q+1,r); 138 } 139 } 140 141 public int partition(int []array,int p,int r){ 142 Random random=new Random(); 143 exchange(array,r,random.nextInt(r-p+1)+p);//随机取数 144 int x=array[r]; 145 int i=p-1; 146 for(int j=p;j<r;j++){ 147 if(array[j]<=x){ 148 i=i+1; 149 exchange(array,i,j); 150 } 151 } 152 exchange(array,i+1,r); 153 return i+1; 154 } 155 156 public void exchange(int []array,int p,int q){ 157 int k=array[p]; 158 array[p]=array[q]; 159 array[q]=k; 160 }