排序

来源:互联网 发布:plc监控网络传输器 编辑:程序博客网 时间:2024/06/08 15:45
/* *冒泡排序:O(n^2) O(1)(辅存) 稳定 *选择排序:O(n^2) O(1)(辅存) 稳定 *插入排序:O(n^2) O(1)(辅存) 稳定 *希尔排序:O(nlogn)--O(n^2) O(1)(辅存) 不稳定 *堆排序:    O(nlogn) O(1)(辅存) 不稳定 *归并排序:O(nlogn) O(n)(辅存) 稳定 *快速排序:O(nlogn) O(logn)--O(n)(辅存) 不稳定 *待排序序列基本有序或者n较小的情况,考虑使用前三种 */public class AllSortMethodTest {public static void main(String[] args){int array[] = {1,6,7,2,9,10,0,11,28,3,14,4,5,123,1,34,134,24};//int array[] = {1,6,7,2,9,10,0};display(array);快速排序(array);display(array);}public static void 冒泡排序(int [] array){if(array == null || array.length ==0) return;int len = array.length;for(int i = len-1;i>=0;i--){for(int j = 0;j<i;j++){if(array[j] > array[j+1])swap(array,j,j+1);}}}public static void 选择排序(int [] array){if(array == null || array.length ==0) return;int len = array.length;for(int i = 0;i<len;i++){int k = i;for(int j = i+1;j<len;j++){if(array[j] < array[k])k=j;}if( k!= i) swap(array,k,i);}}public static void 插入排序(int [] array){if(array == null || array.length ==0) return;int len = array.length;int temp=0;for(int i = 1,j;i<len;i++){temp = array[i];for(j = i-1;j>=0 && array[j] > temp;j--){array[j+1]=array[j];}array[j+1]=temp;}}public static void 希尔排序(int [] array){if(array == null || array.length ==0) return;int i,j;int len = array.length;int increment = len;int temp=0;//用于暂存do{increment = increment/3+1;for(i=increment;i<len;i++){if(array[i] < array[i-increment]){temp=array[i];for(j=i-increment;j>=0 && array[j] > temp;j-=increment){array[j+increment]=array[j];//记录 }array[j+increment]=temp;}}}while(increment > 1);}public static void 堆排序(int [] array){if(array == null || array.length ==0) return ;int len = array.length;int data[] = new int[len+1];for(int i = 0;i<len;i++){data[i+1] = array[i];//将数据移动至data的1--n}for(int i = len/2;i>=1;i--){headAdjust(data,i,len);}for(int i = len;i>=1;i--){swap(data,1,i);headAdjust(data,1,i-1);}for(int i = 0;i<len;i++){array[i]=data[i+1];//将数据移动至data的1--n}}public static void headAdjust(int [] array,int ding,int end){int temp = array[ding];for(int j = ding*2;j<=end;j*=2){if(j<end && array[j+1] > array[j] )j++;if(array[ding] > array[j])break;array[ding] = array[j];ding = j;}array[ding]=temp;}public static void 归并排序(int [] array){if(array == null || array.length ==0) return ;MaxSize = array.length;MSort(array,array,0,array.length-1);}static int MaxSize=0;public static void MSort(int [] SR,int TR1[],int start,int end){//将SR[start-end]归并排序为TR1[start-end]int []TR2 = new int[MaxSize+1];if(start == end){TR1[start] = SR[start];}else{int m = (start+end)/2;MSort(SR,TR2,start,m);//将SR[start-m]归并排序为TR2[start-m]MSort(SR,TR2,m+1,end);//将SR[m+1-end]归并排序为TR2[m+1-end]Merge(TR2,TR1,start,m,end);//将TR2[start-m] TR2[m+1-end]归并到TR1[start-end]}}public static void Merge(int [] array,int[] result,int start,int m,int end){int i,j,k;for(i = start,j=m+1,k=start ; i<=m && j<=end;){if(array[i] < array[j]){result[k++]=array[i++];}else{result[k++]=array[j++];}}while(i<=m){result[k++]=array[i++];}while(j<=end){result[k++]=array[j++];}}public static void 快速排序(int [] array){if(array == null || array.length ==0) return ;QSort(array,0,array.length-1);}private static void QSort(int [] array,int low,int high){int pivot;if(low < high){pivot = Partition(array,low,high);QSort(array,low,pivot-1);QSort(array,pivot+1,high);}}private static int Partition(int [] array,int low,int high){int key = array[low+high-low];while(low < high){while(low < high && array[low] <= key){low++;}swap(array,low,high);while(low < high && array[high] >= key){high--;}swap(array,low,high);}return low;}public static void swap(int [] array,int i,int j){int temp = array[i];array[i] = array[j];array[j] = temp;}public static void display(int [] array){if(array == null || array.length ==0) return;for(int i = 0;i<array.length;i++){System.out.print(array[i]+" ");}System.out.println();}}

0 0