各种排序算法

来源:互联网 发布:汽车保险算法 编辑:程序博客网 时间:2024/06/09 20:18
package xutao.test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.StringReader;import java.util.Date;import java.util.Stack;public class Helloworld {public static void main(String[] args) {final int size = 10000;int[] array = new int[size];array[0] = -1;//为方便堆排序所作for(int i =1;i<size;i++){array[i] = (int)(Math.random()*2*size);}Sort[] sorts = new Sort[8];sorts[0] = new BubbleSort();sorts[1] = new SelectionSort();sorts[2] = new InsertionSort();sorts[3] = new ShellSort();sorts[4] = new MergeSort();sorts[5] = new QuickSort();sorts[6] = new QuickSort1();sorts[7] = new HeapSort();for(Sort sort : sorts){int[] eachArray = new int[size];System.arraycopy(array, 0, eachArray, 0, size);sort.nums = eachArray;}for(Sort sort : sorts){double start = new Date().getTime();sort.sort();double end = new Date().getTime();System.out.println(sort.toString() + "耗时:  " + (end-start));}}}abstract class Sort{public void show(){for(int num : nums){System.out.println(num);}}protected void swap(int i,int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;} public abstract void sort();public int[] nums = new int[]{1,9,7,4,8,2,5,6,3};}class BubbleSort extends Sort{public void sort(){boolean flag = true;//有逆序for(int i=0;i<nums.length-1&&flag;i++){flag = false;for(int j=0;j<nums.length-1-i;j++){if(nums[j] > nums[j+1]){swap(j,j+1);flag = true;}}}}public String toString(){return "BubbleSort";}}class SelectionSort extends Sort{public void sort(){for(int i =0; i< nums.length -1;i++){//每次从i直到最后的区间里面选择最小的和i交换swap(i, smallest(i));}}private int smallest(int i){int small = i;for(int k = i+1;k<nums.length; k++){if(nums[k]<nums[small])small = k;}return small;}public String toString(){return "SelectionSort";}}class InsertionSort extends Sort{public void sort(){for(int i = 1;i<nums.length;i++){//每次插入一个数字insert(i);}}private void insert(int i){for(;i>=1;i--){if(nums[i]<nums[i-1])swap(i,i-1);elsebreak;}}public String toString(){return "InsertionSort";}}class ShellSort extends Sort{public void sort(){int width = nums.length;do{width = width/3 + 1;insertionSortByStep(width);}while(width > 1);}private void insertionSortByStep(int width){for(int i=0;i<width;i++){insertionEachSubGroup(i,width);}}private void insertionEachSubGroup(int i,int width){for(int k=i+width;k<nums.length;k+=width){for(int current=k;current>=i+width;current-=width){if(nums[current]<nums[current-width])swap(current,current-width);elsebreak;}}}public String toString(){return "ShellSort";}}class HeapSort extends Sort{public void sort(){for(int i= nums.length/2;i>=1;i--){HeapAdjust(i,nums.length-1);}}private void HeapAdjust(int i,int max){int temp = nums[i];for(int j = 2*i;j<=max;j*=2){if(j<max && nums[j]<nums[j+1])++j;if(temp >= nums[j])break;nums[i] = nums[j];i = j;}nums[i] = temp;}public void show(){for(int i = nums.length-1;i>=1;i--){System.out.println(nums[1]);swap(1,i);HeapAdjust(1,i-1);}}public String toString(){return "HeapSort";}}class MergeSort extends Sort{public void sort(){int[] copyNums = new int[nums.length];recursiveSort(nums,copyNums,0,nums.length-1);}private void recursiveSort(int[] nums,int[] copyNums,int low,int high){if(low<high){int middle = (low + high) / 2 ;recursiveSort(nums,copyNums,low,middle);recursiveSort(nums,copyNums,middle+1,high);merge(nums,copyNums,low,middle,high);}}private void merge(int[] nums,int[] copyNums,int low,int middle,int high){for(int i = low;i <= high;i++){copyNums[i] = nums[i];}int realCurrent = low;int leftCurrent = low;int rightCurrent = middle + 1;while(leftCurrent <= middle && rightCurrent <= high){if(copyNums[leftCurrent] < copyNums[rightCurrent]){nums[realCurrent++] = copyNums[leftCurrent++];}else{nums[realCurrent++] = copyNums[rightCurrent++];}}while(leftCurrent<=middle){nums[realCurrent++] = copyNums[leftCurrent++];}while(rightCurrent<=high){nums[realCurrent++] = copyNums[rightCurrent++];}}public String toString(){return "MergeSort";}}class QuickSort extends Sort{public void sort(){quickSort(nums,0,nums.length-1);}private void quickSort(int[] nums,int low,int high){if(low<high){int pivot = Partition(low,high);quickSort(nums,low,pivot-1);quickSort(nums,pivot+1,high);}}private int Partition(int low,int high){int pivotKey = nums[low];while(low<high){while(low<high && nums[high]>=pivotKey){high--;}swap(low,high);while(low<high && nums[low]<= pivotKey)//注意==号是需要的,否则将死循环{low++;}swap(low,high);}return low;}public String toString(){return "QuickSort";}}class QuickSort1 extends Sort{private final int MAX_LENGTH_INSERTION_SORT = 20;public void sort(){quickSort(nums,0,nums.length-1);}private void quickSort(int[] nums,int low,int high){if( (high-low)>MAX_LENGTH_INSERTION_SORT)  //优化1{while(low < high){int pivot = Partition(low,high);quickSort(nums,low,pivot-1);low = pivot + 1;//优化2}}else{//插入排序for(int i = low+1;i<=high;i++){for(int k = i ;k>=low+1;k--){if(nums[k]<nums[k-1])swap(k,k-1);elsebreak;}}}}private int Partition(int low,int high){int middle = low + (high - low)/2; //优化4,优化枢轴if(nums[low] > nums[high]){swap(low,high);}if(nums[middle] > nums[high]){swap(low,high);}//high最大if(nums[low] < nums[middle]){swap(low,middle);}//保证low是中间的int pivotKey = nums[low];while(low<high){while(low<high && nums[high]>=pivotKey){high--;}nums[low] = nums[high];//优化3,用来回替换代替swapwhile(low<high && nums[low]<= pivotKey)//注意==号是需要的,否则将死循环{low++;}nums[high] = nums[low];}nums[low] = pivotKey;return low;}public String toString(){return "QuickSort1";}}