/*
*冒泡排序: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();
}
}
排序
最新推荐文章于 2024-03-28 00:29:10 发布