首页 > 代码库 > 排序汇总
排序汇总
- 选择排序:
对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录位置互换;
接着对不含第一个记录以外的其他记录进行第二轮比较,得到最小的记录与第二个记录互换;
重复
- 插入排序:
初始化第一个记录自成一个有序序列,其余记录为无序序列。
接着从第二个记录开始,按记录的大小一次讲当前的记录插入到其之前的有序序列之中,知道最后一个记录插入到有序序列中。
- 冒泡排序:(是一种交换排序)
对于给定的n个记录,从第一个记录开始一次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较后,n个记录中的最大记录将位于第n位;
然后对前(n-1)个记录进行第二轮比较;
重复该过程直到进行比较的记录只剩下一个为止。
- 希尔排序:(是一种插入排序)
又叫“缩小增量排序”:先将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较小,
然后对各个子序列进行直接插入排序,
待整个排序序列“基本有序后”,最后再对所有元素进行一次直接插入排序。
- 快速排序:(是一种交换排序)
采用“分而治之”的思想,把大的折分为小的,小的再折分为最小的。其原理如下:
对于给定的一组记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录比后一部分的所有记录小;
然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均为有序为止。
一趟排序过程如下:
从high所指位置向前搜索第一个关键字小于pivotkey的记录,将其交换至低端;
再从low所指位置向后搜索第一个关键字大于pivotkey的记录,将其交换至高端;
重复上述两步,直到low==high为止;
再分别对两个子序列进行快排,直到每个子序列只有一个元素为止。
- 堆排序:(是一种选择排序)
对于给定的n个记录,初始时把这些记录看作一颗顺序存储的二叉树,然后将其调整为一个大顶堆,
然后将堆得最后一个元素与堆顶元素(即二叉树的根节点)进行交换,堆得最后一个元素即为最大记录;
接着将前(n-1)个元素重新调整成为一个大顶堆,再将堆顶元素与当前堆得最后一个元素进行交换后得到次大记录,
重复该过程直到调整的堆只剩下一个元素时为止,钙元素即为最小元素,此时得到一个有序序列
- 归并排序:
递归和分治
对于给定的一组记录(假设共有n个记录)
首先将两个相邻的长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或1的有序子序列,
再将其两两归并,反复执行该过程,直到得到一个有序序列。
1 public class sortTest { 2 3 //选择排序 4 public static void selectSort(int[] a){ 5 int i,j; 6 int temp=0; 7 int flag=0; 8 for(i=0;i<a.length;i++){ 9 temp=a[i]; 10 for(j=i+1;j<a.length;j++){ 11 if(a[j]<temp){ 12 temp=a[j]; 13 flag=j; 14 } 15 } 16 if(flag!=i){ 17 a[flag]=a[i]; 18 a[i]=temp; 19 } 20 } 21 22 } 23 24 25 //插入排序 26 public static void insertSort(int[] a){ 27 int i,j; 28 int temp=0; 29 for(i=0;i<a.length;i++){ 30 temp=a[i]; 31 j=i; 32 if(a[j-1]>temp){ 33 while(j>=1&&a[j-1]>temp){ 34 a[j]=a[j-1]; 35 j--; 36 } 37 } 38 a[j]=temp; 39 } 40 } 41 42 //冒泡排序,一种交换排序,时间复杂度n^2,平均同,最小n 空间复杂度1 稳定 43 public static void BubbleSort(int[] a){ 44 int i,j; 45 int temp; 46 for(i=0;i<a.length;i++){ 47 temp=a[i]; 48 for(j=a.length-1;j>i;j--){ 49 if(a[j]<a[j-1]){ 50 temp=a[j]; 51 a[j]=a[j-1]; 52 a[j-1]=temp; 53 } 54 } 55 } 56 } 57 58 59 //希尔排序,是一种插入排序 时间复杂度n,nlogn,n^2 空间复杂度1 不稳定 60 public static void shellSort(int[] a){ 61 int i,j; 62 for(int h=a.length/2;h>0;h=h/2){ 63 for(i=h;i<a.length;i++){ 64 int temp=a[i]; 65 for(j=i-h;j>=0;j-=h){ 66 if(temp<a[j]) 67 a[j+h]=a[j]; 68 else 69 break; 70 } 71 a[j+h]=temp; 72 } 73 } 74 } 75 76 77 //快排,是一种交换排序 时间复杂度nlogn ,nlogn, n^2 空间logn 不稳定 78 public static void quicklySort(int[] a){ 79 quickSort(a,0,a.length); 80 } 81 public static void quickSort(int[] array,int low,int high){ 82 int i,j,index; 83 if(low>=high) 84 return; 85 i=low; 86 j=high; 87 index=array[i]; 88 while(i<j){ 89 while(i<j&&array[j]>=index) 90 j--; 91 if(i<j) 92 array[i++]=array[j]; 93 while(i<j&&array[i]<index) 94 i++; 95 if(i<j) 96 array[j--]=array[i]; 97 } 98 array[i]=index; 99 quickSort(array,low,i-1);100 quickSort(array,i+1,high); 101 }102 103 104 105 //堆排序 一种选择排序 时间复杂度nlogn nlogn nlogn 空间复杂度1 不稳定106 public static void adjustMinHeap(int[] a,int pos,int len){107 int temp,child;108 for(temp=a[pos];2*pos+1<=len;pos=child){109 child=2*pos+1;110 if(child<len&&a[child]>a[child+1]){111 child++;112 }113 if(a[child]<temp){114 a[pos]=a[child];115 a[child]=temp;116 }117 else118 break; 119 }120 121 }122 public static void MyMinHeapSort(int[] a){123 int i;124 int len=a.length;125 for(i=len/2-1;i>=0;i--){//初始化堆126 adjustMinHeap(a,i,len-1);127 }128 for(i=len-1;i>=0;i--){//交换堆顶与最后一个元素129 int temp=a[0];130 a[0]=a[i];131 a[i]=temp;132 adjustMinHeap(a,0,i-1);133 }134 }135 136 137 138 //归并排序 时间复杂度nlogn nlogn nlogn 空间logn 稳定139 public static void merge(int[] a,int p,int q,int r){140 int i,j,k,n1,n2;141 n1=q-p+1;142 n2=r-q;143 int[] L=new int[n1];144 int[] R=new int[n2];145 for(i=0,k=p;i<n1;i++,k++){146 L[i]=a[k];147 }148 for(j=0,k=q+1;j<n2;j++,k++){149 R[j]=a[k];150 }151 for(i=0,j=0,k=p;i<n1&&j<n2;k++){152 if(L[i]>R[j]){153 a[k]=R[j];154 j++;155 }156 if(L[i]<R[j]){157 a[k]=L[i];158 i++;159 }160 }161 if(i<n1){162 for(int g=i;j<n1;g++,k++){163 a[k]=L[g];164 }165 }166 if(j<n2){167 for(int g=j;j<n2;g++,k++){168 a[k]=L[g];169 }170 } 171 }172 public static void MergeSort(int[] a,int p,int r){173 if(p<r){174 int q=(p+r)/2;175 MergeSort(a,p,q);176 MergeSort(a,q+1,r);177 merge(a,p,q,r);178 }179 }180 181 public static void main(String[] args){182 int i=12;183 System.out.println(i-=i*=i);184 185 }
排序汇总