给定一个长度为 n 的数组,请你编写一个函数,返回该数组按升序排序后的结果。
数据范围: ,数组中每个元素都满足
要求:时间复杂度 ,空间复杂度
进阶:时间复杂度 ,空间复杂度
注:本题数据范围允许绝大部分排序算法,请尝试多种排序算法的实现。
[5,2,3,1,4]
[1,2,3,4,5]
[5,1,6,2,5]
[1,2,5,5,6]
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { Arrays.sort(arr); return arr; } }
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here boolean needSort = true; while (needSort) { needSort = false; for (int i = 0 ; i < arr.length - 1 ; i++) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; needSort = true; } } } return arr; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { if(arr.length<=1){ return arr; } for (int i = 1; i < arr.length; i++) { for (int j = i; j >= 1; j--) { if (arr[j] < arr[j - 1]) { int temp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = temp; } } } return arr; } }
快速排序
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { quickSort(arr,0,arr.length-1); return arr; } public void quickSort(int[] q,int l,int r){ if(l>=r) return; int i=l-1,j=r+1; int x=q[l+(r-l)/2]; while(i<j){ do i++; while(q[i]<x); do j--; while(q[j]>x); if(i<j){ int t=q[i]; q[i]=q[j]; q[j]=t; } } quickSort(q,l,j); quickSort(q,j+1,r); } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here //快速排序 if (arr.length == 0 || arr== null) { return arr; } sort(arr, 0, arr.length - 1); return arr; } public void sort(int[] arr, int start, int end) { if (start > end) { return; } int pivot = arr[start]; int left = start; int right = end; //start和end就是左右双向指针 start大于end就是比较到中间 指针交换了 就停止循环 while (left <= right) { while (left <= right && pivot > arr[left]) { left++; } while (left <= right && pivot < arr[right]) { right--; } if (left <= right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } sort(arr, start, right); sort(arr, left, end); } }
public int[] MySort (int[] arr) { // write code here quickSort(arr,0,arr.length-1); return arr; } public void quickSort(int[] arr ,int start ,int end){ if(start>=end){ return; } int mid=partition(arr,start,end); quickSort(arr,start,mid-1); quickSort(arr,mid+1,end); } public int partition(int[] arr ,int start ,int end){ int mid=arr[start] ,p1=start ,p2=end; while(p1<p2){ while(p1<p2 && arr[p1]<mid){ p1++; } while(p1<p2 && arr[p2]>mid){ p2--; } int temp=arr[p1]; arr[p1]=arr[p2]; arr[p2]=temp; } return p1; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here int low=0,high=arr.length-1; QuickSort(arr,low,high); return arr; } public void QuickSort(int[] arr,int low, int high){ if(low<high){ int pivotpos=Partition(arr,low,high);// 分 QuickSort(arr,low,pivotpos-1); QuickSort(arr,pivotpos+1,high); } } private int Partition(int[] arr,int low, int high){ int pivot=arr[low]; while(low<high){ while(low<high&&arr[high]>=pivot) --high; arr[low]=arr[high]; while(low<high&&arr[low]<=pivot) ++low; arr[high]=arr[low]; } arr[low]=pivot; return low; } }
class Solution2{ /** * 堆排序 --- 数组构造完全二叉树 --- arr --- 下标i从0开始,左孩子下标2*i+1,右孩子小标2*i+2 --- (i-1)//2为父节点(i=0是根结点) */ public int[] MySort2(int[] arr){ heapSort(arr,(x, y)->{return y - x;}); return arr; } public void heapSort(int[] arr,Comparator<Integer> comparator){ if (arr == null || arr.length < 2) return; for (int i = 0; i < arr.length; i++) { tryUp(arr,i,comparator); // 构建堆 } // 堆 --> 排序 (不断删除堆顶与重构堆的过程 ---> 一个简单方法是堆顶与末尾元素交换,size--,重构堆) int size = arr.length; // 注意 堆顶下标idx = 0, 末尾元素下标tailIdx = size - 1 while(size > 1){ int topIdx = 0,tailIdx = size - 1; swap(arr,topIdx,tailIdx); tryDown(arr,--size,topIdx,comparator); } } public void tryUp(int[] arr,int idx,Comparator<Integer> comparator){ // 从idx到0,从下向上建堆 int fatherIdx = (idx -1) / 2; // father >= 0 while(comparator.compare(arr[fatherIdx],arr[idx]) < 0){ swap(arr,fatherIdx,idx); idx = fatherIdx; } } public void tryDown(int[] arr,int size,int idx,Comparator<Integer> comparator){ // 从idx到size-1, 从上向下建堆 int leftIdx = 2 * idx + 1; while(leftIdx < size){ int rightIdx = leftIdx + 1; int swapIdx = (rightIdx >= size) || comparator.compare(arr[leftIdx],arr[rightIdx]) > 0 ? leftIdx : rightIdx; if (comparator.compare(arr[idx],arr[swapIdx]) >= 0) break; swap(arr,idx,swapIdx); idx = swapIdx; leftIdx = 2 * idx + 1; } } public void swap(int[] arr,int i,int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here quickSort(arr,0,arr.length-1); return arr; } private void quickSort(int[] arr,int left,int right){ int l=left; int r=right; int pivot=arr[(l+r)/2]; int temp; while(l<r){ while(arr[l]<pivot){ l+=1; } while(arr[r]>pivot){ r-=1; } if(l>=r){ break; } temp=arr[l]; arr[l]=arr[r]; arr[r]=temp; if(arr[l]==pivot){ r-=1; } if(arr[r]==pivot){ l+=1; } } if(l==r){ l+=1; r-=1; } if(left<r){ quickSort(arr,left,r); } if(right>l){ quickSort(arr,l,right); } } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here //========================== //冒泡排序 // int temp = 0; // for(int i=0;i<arr.length-1;i++){ // for(int j=0;j<arr.length-i-1;j++){ // if(arr[j]>arr[j+1]){ // temp = arr[j]; // arr[j] = arr[j+1]; // arr[j+1] = temp; // } // } // } // return arr; //========================== //冒泡改进版 // int len = arr.length; // while(len>0){ // for(int i=0;i<len-1;i++){ // int next = i+1; // if(arr[i]>arr[next]){ // int temp = arr[i]; // arr[i] = arr[next]; // arr[next] = temp; // } // } // len--; // } // return arr; //========================== //快速排序 // quicksort(arr,0,arr.length-1); // return arr; //========================== //选择排序 // for(int i=0;i<arr.length;i++){ // int minIndex = i; // for(int j=i;j<arr.length;j++){ // if(arr[j]<arr[minIndex]){ // minIndex = j; // } // } // int temp = arr[i]; // arr[i] = arr[minIndex]; // arr[minIndex] = temp; // } // return arr; //========================== //插入排序 // int current; // for(int i=0;i<arr.length-1;i++){ // //拿出第一个未排序数(待插入数) // current = arr[i+1]; // //设置最后一个已排序位置 // int preIndex = i; // //依次对比拿出来的数,如果此数比待插入大, // //就往后移动一位(第一次循环会覆盖current的位置) // while(preIndex>=0 && current<arr[preIndex]){ // //往右移动 // arr[preIndex+1] = arr[preIndex]; // //待插入数位置往左移动 // preIndex--; // } // //当遇到比待插入数小的数时候停止循环,此时preIndex已经向左移动了, // //+1移动回来到空位,插入 // arr[preIndex+1] = current; // } // return arr; //========================== //希尔排序 // for(int gap=arr.length/2; gap>=1 ;gap/=2){ // for(int i=0;i<arr.length-gap;i+=gap){ // int index = i; // int current = arr[i+gap]; // while(index >= 0 && current < arr[index]){ // arr[index+gap] = arr[index]; // index -= gap; // } // arr[index + gap] = current; // } // } //归并排序调用 // return sort(arr); //堆排序调用 // sort(arr); //计数排序调用 // return countingSort(arr,getMaxValue(arr)); return bucketSort(arr,100); // return arr; } //------------------------------------------------------------------------------------------ //========================== //归并排序 //归并递归 // public static int[] sort(int[] arr){ // if(arr.length<2){ // return arr; // } // int middle = (int)Math.floor(arr.length/2);//例2.5-->2 // int[] left = Arrays.copyOfRange(arr,0,middle); // int[] right = Arrays.copyOfRange(arr,middle,arr.length); // return merge(sort(left),sort(right)); // } // //合并 // public static int[] merge(int[] left,int[] right){ // int[] result = new int[left.length+right.length]; // int i = 0; // //当两组都有数时 // while(left.length > 0 && right.length > 0){ // //如果左边的小,把左边的头数放入结果数组,删除left第一个数,使下一个数变成头数 // if(left[0] <= right[0]){ // result[i++] = left[0]; // left = Arrays.copyOfRange(left,1,left.length); // }else{ // result[i++] = right[0]; // right = Arrays.copyOfRange(right,1,right.length); // } // } // //当仅剩左数组有数时 // while(left.length > 0){ // result[i++] = left[0]; // left = Arrays.copyOfRange(left,1,left.length); // } // //同理 // while(right.length > 0){ // result[i++] = right[0]; // right = Arrays.copyOfRange(right,1,right.length); // } // return result; // } //========================== //计数排序(测试数据的数很大,会出现数组越界) // public int[] countingSort(int[] arr,int maxvalue){ // int bucketLen = maxvalue + 1; // int[] bucket = new int[bucketLen]; // //计数数组 // for(int value:arr){ // bucket[value]++; // } // //结果数组待添加的位置 // int sortedIndex = 0; // for(int j=0;j<bucketLen;j++){ // while(bucket[j]>0){ // arr[sortedIndex++] = j; // bucket[j]--; // } // } // return arr; // } // public int getMaxValue(int[] arr){ // int maxvalue = arr[0]; // for(int value:arr){ // if(value > maxvalue){ // maxvalue = value; // } // } // return maxvalue; // } //========================== //桶排序(对于大数效率还是很低) // private int[] bucketSort(int[] arr,int bucketSize){ // int minvalue = arr[0]; // int maxvalue = arr[0]; // for(int value:arr){ // if (value < minvalue) { // minvalue = value; // } else if (value > maxvalue) { // maxvalue = value; // } // } // int bucketCount = (int) Math.floor((maxvalue-minvalue)/bucketSize)+1; // int[][] buckets = new int[bucketCount][0]; // //分配到桶 // for(int i=0;i<arr.length;i++){ // int index = (int)Math.floor((arr[i]-minvalue)/bucketSize); // buckets[index] = arrAppend(buckets[index],arr[i]); // } // //装入结果数组 // int arrIndex = 0; // for(int[] bucket:buckets){ // if(bucket.length<=0){ // continue; // } // //排序单个桶的数据 // //用希尔排序(原用插入排序) // for(int gap=bucket.length/2; gap>=1 ;gap/=2){ // for(int i=0;i<bucket.length-gap;i+=gap){ // int index = i; // int current = bucket[i+gap]; // while(index >= 0 && current < bucket[index]){ // bucket[index+gap] = bucket[index]; // index -= gap; // } // bucket[index + gap] = current; // } // } // for(int value:bucket){ // arr[arrIndex++] = value; // } // } // return arr; // } // //数组扩容插入 // private int[] arrAppend(int[] arr, int value){ // arr = Arrays.copyOf(arr,arr.length + 1); // arr[arr.length-1] = value; // return arr; // } //========================== //堆排序 // public int[] sort(int[] arr){ // int len = arr.length; // buildMaxheap(arr,len); // for(int i = len -1;i>0;i--){ // swap(arr,0,i); // len--; // heapify(arr,0,len); // } // return arr; // } // //将整个数组整理成大根数 // public void buildMaxheap(int[] arr,int len){ // for(int i = (int)Math.floor(len/2);i>=0;i--){ // heapify(arr,i,len); // } // } // //下滤 // public void heapify(int[] arr,int i,int len){ // int left = 2*i+1; // int right = 2*i+2; // int largest = i; // if(left<len && arr[left]>arr[largest]){ // largest = left; // } // if(right<len && arr[right]>arr[largest]){ // largest = right; // } // if(largest != i){ // swap(arr,i,largest); // heapify(arr,largest,len); // } // } // public void swap(int[] arr, int i, int j) { // int temp = arr[i]; // arr[i] = arr[j]; // arr[j] = temp; // } //========================== //快速排序递归方法 // public static void quicksort(int[] target,int left,int right){ // if(left>=right){ // return; // } // int pivot = target[left]; // int l = left; // int r = right; // while(l < r){ // while(target[r] >= pivot && l<r){ // r --; // } // target[l] = target[r]; // while(target[l]<=pivot && l<r){ // l ++; // } // target[r] = target[l]; // } // target[l] = pivot; // quicksort(target,left,l-1); // quicksort(target,r+1,right); // } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here /*冒泡查找 int temp=0; int i=0,j=0; for(;i<arr.length;i++) for(j=i+1;j<arr.length;j++) { if(arr[i]>arr[j]) { temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } } return arr; */ /*选择排序 int i=0,j=0; int temp=0,index=0; for(i=0;i<arr.length;i++) { temp=arr[i]; index=i; for(j=i+1;j<arr.length;j++) if(arr[j]<temp) { temp=arr[j]; index=j; } arr[index]=arr[i]; arr[i]=temp; } return arr; */ /*插入排序 int i=0,j=0,k=0; int temp=0,index=0; for(;i<arr.length;i++){ temp=arr[i]; index=i; for(j=i+1;j<arr.length;j++) if(arr[j]<temp) { temp=arr[j]; index=j; } for(k=index;k>i;k--) { arr[k]=arr[k-1]; } arr[i]=temp; } return arr; */ } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here quickSort(arr,0,arr.length - 1); return arr; } public void quickSort(int[] arr,int l,int r){ if(l >= r) return; int x = arr[l]; int i = l - 1; int j = r + 1; while(i < j){ while(arr[++i] < x); while(arr[--j] > x); if(i < j) swap(arr,i,j); } quickSort(arr,l,j); quickSort(arr,j + 1,r); } public void swap(int[] arr,int i,int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here if (arr == null) { throw new IllegalArgumentException(); } Arrays.sort(arr); return arr; } }