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); } }
常见的排序算法实现
猜你喜欢
转载自blog.csdn.net/shl_shl/article/details/71023196
今日推荐
周排行