第一种:快排
public int[] MySort (int[] arr) { // write code here sort(arr,0,arr.length-1); return arr; } private void sort(int[] arr, int start, int end) { if(start>=end) return; int index = partion(arr,start,end); sort(arr,start,index-1); sort(arr,index+1,end); } //找到下标start的元素在数组排完序之后的位置 并替换 private int partion(int[] arr, int start, int end) { int temp=arr[start]; int left=start; int right=end; while (left<right){ //从右往左找第一个小于temp的数 while (right>left && arr[right]>=temp){ right--; } arr[left]=arr[right]; while (left<right && arr[left]<temp){ left++; } arr[right]=arr[left]; } //相遇的位置就是temp的排序后位置 arr[left]=temp; return left; }
第二种:归并排序
public int[] MySort (int[] arr){ if(arr==null) return arr; int[] temp=new int[arr.length];//辅助空间 sort(arr,0,arr.length-1,temp); return arr; } private void sort(int[] arr, int start, int end,int[] temp) { if (start>=end) return; int mid=(end-start)/2+start; //对左边进行排序 sort(arr,start,mid,temp); //对右边进行排序 sort(arr,mid+1,end,temp); //合并左右两边 hebing(arr,start,mid,end,temp); } //将原数组链两个有序的序列进行比较排序并赋值到辅助数组temp,最后再依次赋值回原数组 private void hebing(int[] arr, int start, int mid, int end, int[] temp) { //start--mid //mid+1--end int i=start; int j=mid+1; int res = start; while (i<=mid && j<=end){ if(arr[i]<arr[j]){ temp[res++]=arr[i]; i++; }else { temp[res++]=arr[j]; j++; } } if (i<=mid){ for(int y=i;y<=mid;y++){ temp[res++]=arr[y]; } } if(j<=end){ for(int y=j;y<=end;y++){ temp[res++]=arr[y]; } } for (int y=start;y<=end;y++){ arr[y]=temp[y]; } }