public class Sort {
//插入排序
public static void InsertSort(int []array){
for(int i=1;i<array.length;i++){
int temp = array[i];
int j = i-1;
while(j>=0 && array[j]>temp){
array[j+1]=array[j];
j--;
}
array[j+1]=temp;
}
}
//Shell排序,当distant==1时。看似是普通的插入排序,但是实际上的复杂度却很小,因为此时已经差不多排好序了,需要数字挪位的情况不多
public static void ShellSort(int []array){
int distant = array.length/2;
while(distant>=1){
for(int i =0;i<distant;i++){
for(int j=i+distant;j<array.length;j+=distant){
int temp=array[j];
int k=j;
while(k>i&&temp<array[k-distant]){
array[k]=array[k-distant];
k-=distant;
}
array[k]=temp;
}
}
distant/=2;
}
}
//冒泡排序
public static void BubbleSort(int []array){
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
int temp = array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
//快速排序
public static void QuickSort(int []array,int left,int right){
if(left>=right){
return ;
}
int key = Partition(array,left,right);
QuickSort(array,left,key-1);
QuickSort(array,key+1,right);
}
public static int Partition(int []array,int left,int right){
int key = array[left];
while(left<right){
while(left<right&&key<=array[right]){
right--;
}
array[left]=array[right];
while(left<right&&key>=array[left]){
left++;
}
array[right]=array[left];
}
array[left]=key;
return left;
}
//选择排序
public static void SelectSort(int []array){
for(int i=0;i<array.length-1;i++){
int min = i;
for(int j=i+1;j<array.length;j++){
if(array[min]>array[j]){
min=j;
}
}
if(min!=i){
int temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
}
//堆排序
public static void HeapSort(int []array){
for(int i=array.length-1;i>=0;i--){
BuildHeap(array,i);
int temp = array[i];
array[i]=array[0];
array[0] = temp;
}
}
public static void BuildHeap(int []array,int n){//建立最大堆
for(int i=(n-1)/2;i>=0;i--){
SiftDown(array,i,n);
}
}
public static void SiftDown(int []array,int i,int n){//调整以i为节点的为最大堆
int left = i*2+1;
int right = i*2+2;
int max = i;
if(left<=n &&array[max]<array[left]){
max = left;
}
if(right<=n &&array[max]<array[right]){
max = right;
}
if(max!=i){
int temp = array[max];
array[max] = array[i];
array[i] = temp;
SiftDown(array,max,n);
}
}
//归并排序
public static void MergeSort(int []array){
Merge_sort(array,0,array.length-1);
}
public static void Merge_sort(int []array,int start,int end){
if(start>=end){
return ;
}
int mid = (start+end)/2;
Merge_sort(array,start,mid);
Merge_sort(array,mid+1,end);
Merge(array,start,end);
}
public static void Merge(int array[],int start,int end){
int mid =(start+end)/2;
int rstart = mid+1;
int []temp = new int[end-start+1];
int index=0;
while(start<=mid&&rstart<=end){
if(array[start]<array[rstart]){
temp[index++] = array[start++];
}else{
temp[index++] = array[rstart++];
}
}
while(start<=mid){
temp[index++]=array[start++];
}
while(rstart<=end){
temp[index++]=array[rstart++];
}
for(int i=0;i<temp.length;i++){
array[end-i] = temp[temp.length-1-i];
}
}
//输出函数
public static void Output(int array[]){
for(int i:array){
System.out.print(i+" ");
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []array1 = {4,3,8,6,1,9,10,35,87,2};
InsertSort(array1);
Output(array1);
int []array2 = {4,3,8,6,1,9,10,35,87,2};
BubbleSort(array2);
Output(array2);
int []array3 = {4,3,8,6,1,9,10,35,87,2};
QuickSort(array3,0,array3.length-1);
Output(array3);
int []array4 = {4,3,8,6,1,9,10,35,87,2};
SelectSort(array4);
Output(array4);
int []array5 = {4,3,8,6,1,9,10,35,87,2};
HeapSort(array5);
Output(array5);
int []array6 = {4,3,8,6,1,9,10,35,87,2};
ShellSort(array6);
Output(array6);
int []array7 = {4,3,8,6,1,9,10,35,87,2};
MergeSort(array7);
Output(array7);
}
}