插入排序合并排序堆排序和快速排序

Posted hunrry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序合并排序堆排序和快速排序相关的知识,希望对你有一定的参考价值。

  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 }

 

以上是关于插入排序合并排序堆排序和快速排序的主要内容,如果未能解决你的问题,请参考以下文章

常见排序算法的实现(归并排序快速排序堆排序选择排序插入排序希尔排序)

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)

C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)

插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析

scratch图解排序算法:插入排序冒泡排序选择排序归并排序快速排序堆排序