public class Demo { public static void main(String[] args) { int length = 8; int arr[] = new int[length]; for(int i=0;i<length;i++) { arr[i] = (int)(Math.random()*8000); } for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); } long startTime = System.currentTimeMillis(); System.out.println("排序!"); //quickSort(arr, 0, arr.length-1); int temp[] = new int[length]; mergeSort(arr, 0, length, temp); System.out.println("排序!"+(System.currentTimeMillis() - startTime)); System.out.println(); for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); } } /** * @param arr * 冒泡排序思想: * 从第一个开始比较,每次将需要选择最大(最小的)放到最后 * 下次在从前面的数据里面找出,再次进行,直到结束 */ public static void bubbleSort1(int arr[]) { int temp ; boolean flag = true; //比较的次数是arr.length-2次 for(int i=0;i<arr.length-1;i++) { flag = true; for(int j = 0;j<arr.length-1-i;j++) { if(arr[j+1]>arr[j]) { flag = false; temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } if(flag) { break; } } } } /** * @param arr * 选择排序,每次选择最小(最大)放在第一个位置上,一次类推 */ public static void bubbleSort2(int arr[]) { int min = 0; int temp =0; for(int i=0;i<arr.length-1;i++) { min = i; for(int j = i;j<arr.length;j++) { if(arr[min]>arr[j]) { min = j; } } if(min != i) { temp = arr[i]; arr[i]=arr[min]; arr[min]=temp; } } } /** * @param arr * 插入排序 * 从前面开始一个一个插入,有序和无序部分,将无序的一个一个的插入到有序里面 */ public static void bubbleSort4(int arr[]) { int temp ; int index; for(int j = 1;j<arr.length;j++) { temp = arr[j]; index = j; for(int z = j-1;z >= 0;z=z-1) { if(temp<arr[z]) { arr[z+1]=arr[z]; index = z; } } arr[index] = temp; } } /** * @param arr * shell排序,先明白插入排序,在进行将插入排序的大小变为数组1/2的大小,进行 */ public static void bubbleSort3(int arr[]) { int temp ; int index; for(int i= arr.length/2;i>0;i=i/2) { for(int j = i;j<arr.length;j++) { temp = arr[j]; index = j; for(int z = j-i;z >= 0;z=z-i) { if(temp<arr[z]) { arr[z+i]=arr[z]; index = z; } } arr[index] = temp; } } } public static void quickSort(int arr[],int left,int right) { int l = left; int r = right; int mid = (left+right)/2; int temp=0; int povi = arr[mid]; while(l<r) { while(arr[l]<povi) { l+=1; } while(arr[r]>povi) { r--; } if(l>=r) { break; } temp = arr[l]; arr[l]=arr[r]; arr[r]=temp; if(arr[l]==povi) { r++; } if(arr[r]==povi) { l--; } } if(l==r) { l++; r--; } if(left<r) { quickSort(arr, left, r); } if(right>l) { quickSort(arr, l, right); } } public static void mergeSort(int arr[],int left,int right,int []temp) { if(left<right) { int mid = (left+right)/2; mergeSort(arr, left, mid, temp); mergeSort(arr, mid, right, temp); merge(arr, left, mid, right, temp); } } public static void merge(int arr[],int left,int mid,int right,int temp[]) { int i = left; int j = mid + 1; int t = 0; while(i<=mid&&j<=right) { if(arr[i]>arr[j]) { temp[t]=arr[j]; t++; j++; }else { temp[t]=arr[i]; t++; i++; } } while(i<=mid) { temp[t] = arr[i]; t++; i++; } while(j<=right) { temp[t] = arr[j]; t++; j++; } //将其复制 t = 0; int tempLeft = left; while(tempLeft <= right) { arr[tempLeft] = temp[t]; t++; tempLeft++; } } }