给定一个长度为 n 的数组,请你编写一个函数,返回该数组按升序排序后的结果。
数据范围: ,数组中每个元素都满足
要求:时间复杂度 ,空间复杂度
进阶:时间复杂度 ,空间复杂度
注:本题数据范围允许绝大部分排序算法,请尝试多种排序算法的实现。
[5,2,3,1,4]
[1,2,3,4,5]
[5,1,6,2,5]
[1,2,5,5,6]
public int[] MySort (int[] arr) { // write code here trueMergeSort(arr,new int[arr.length],0,arr.length-1); return arr; } public static void trueMergeSort(int[] arr,int[] tempArr,int left,int right){ if(left >= right){ return; } int mid = (left+right)/2; trueMergeSort(arr,tempArr,left,mid); trueMergeSort(arr,tempArr,mid+1,right); partitionMerge(arr,tempArr,left,right); } public static void partitionMerge(int[] arr,int[] tempArr,int left,int right){ int mid = (left + right)>>>1; int lPointer = left,rPointer = mid+1,tempIndex = left; while(lPointer<=mid && rPointer<=right){ tempArr[tempIndex++] = arr[lPointer]>arr[rPointer]? arr[rPointer++]:arr[lPointer++]; } while(lPointer<=mid){ tempArr[tempIndex++]=arr[lPointer++]; } while(rPointer<=right){ tempArr[tempIndex++]=arr[rPointer++]; } for(int i=left;i<=right;i++){ arr[i] = tempArr[i]; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here sort(arr); return arr; } public static void sort(int []arr){ //1.构建大顶堆 for(int i=arr.length/2-1;i>=0;i--){ //从第一个非叶子结点从下至上,从右至左调整结构 adjustHeap(arr,i,arr.length); } //2.调整堆结构+交换堆顶元素与末尾元素 for(int j=arr.length-1;j>0;j--){ swap(arr,0,j);//将堆顶元素与末尾元素进行交换 adjustHeap(arr,0,j);//重新对堆进行调整 } } /** * 调整大顶堆(仅是调整过程,建立在大顶堆已构建的基础上) * @param arr * @param i * @param length */ public static void adjustHeap(int []arr,int i,int length){ int temp = arr[i];//先取出当前元素i for(int k=i*2+1;k<length;k=k*2+1){//从i结点的左子结点开始,也就是2i+1处开始 if(k+1<length && arr[k]<arr[k+1]){//如果左子结点小于右子结点,k指向右子结点 k++; } if(arr[k] >temp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换) arr[i] = arr[k]; i = k; }else{ break; } } arr[i] = temp;//将temp值放到最终的位置 } /** * 交换元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a ,int b){ int temp=arr[a]; arr[a] = arr[b]; arr[b] = temp; } }
class Solution { public: vector<int> MySort(vector<int>& arr) { if(arr.size() == 0) return {}; quicksort(arr, 0, arr.size()-1); return arr; } int partition(vector<int>& arr, int left, int right) { // 取数组中最右边的值为主元 int count = left; // 记录小于主元的个数 while(left < right) { if(arr[left] < arr[right]) { swap(arr[left], arr[count]); ++count; } ++left; } swap(arr[count], arr[right]); return count; } void quicksort(vector<int>& arr, int left, int right) { if(left > right) // 递归结束条件 return ; int privotIndex = partition(arr, left, right); quicksort(arr, left, privotIndex-1); quicksort(arr, privotIndex+1, right); } };
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { sort(arr, 0, arr.length - 1); return arr; } public void sort(int[] a, int low, int high) { // 递归终止条件 if(low >= high) { return; } int i = low; int j = high; // 基准位 int temp = a[low]; while(i < j) { // 找出从右到左第一个小于基准位的数下标 while(i < j && temp <= a[j]) { j--; } // 找出从左到右第一个大于基准位的数下标 while(i < j && temp >= a[i]) { i++; } if(i < j) { swap(a, i, j); } } // 此时 i==j swap(a, low, i); sort(a, low, i-1); sort(a, i+1, high); } public void swap(int[] a, int i, int j) { int c = a[i]; a[i] = a[j]; a[j] = c; } }
//简单明了的java代码 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 left, int right) { int left_copy = left; int right_copy = right; int ken = arr[left];//每次取数组的最左作为基准数 int flag = 0; // 填坑:0表示坑在左边,1表示坑在右边 while (left < right) { if (flag == 0) { if (ken > arr[right]) { arr[left] = arr[right]; left++; flag = 1;//坑换到右边 } else if (ken <= arr[right]) { right --; } } else if (flag == 1) { if (ken < arr[left]) { arr[right] = arr[left]; right--; flag = 0;//坑换到左边 } else if (ken >= arr[left]) { left ++; } } } arr[left] = ken;//把基准数填在最后左右见面的位置 if (left_copy < left-1) quickSort(arr, left_copy, left-1); if (left + 1 < right_copy) quickSort(arr, left+1, right_copy); } }
/** * 使用sort函数 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ function MySort( arr ) { return arr.sort((a,b)=>a-b) } module.exports = { MySort : MySort };
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型vector 待排序的数组 * @return int整型vector */ vector<int> MySort(vector<int>& arr) { // write code here mySort1(arr); return arr; } // 1、快速排序(通过) // 时间复杂度O(logn)。空间复杂度是O(n)。 // 主要是要找出标杆值(中间值),默认最后一个值为标杆值,然后比它小的放左边,比他大的放右边,然后交换最后一位。就得到标杆值在中间的下标。 // 树,从上往下排序 // 不稳定算法 void mySort1(vector<int>& arr) { quicksort(arr, 0, arr.size()-1); } void quicksort(vector<int> &arr, int left, int right) { if (left > right) return; int pivotIndex = partition(arr, left, right); // 标杆值所在的位置 quicksort(arr, left, pivotIndex-1); // 左半边 quicksort(arr, pivotIndex+1, right); // 右半边 } // 这里只需要把数据归类就行,不需要比较大小;每次比标杆值小的放左边,比标杆值大的放右边。 int partition(vector<int> &arr, int left, int right) { // 最后一个值当做标杆(自己随意定) int mark = arr[right]; // 记录小于标杆值的个数 int counter = left; for (int i = left; i < right; i++) { if (arr[i] < mark) { // 当前值和标杆值比较,决定是放在左边还是右边 swap(arr[i], arr[counter++]); } } swap(arr[counter], arr[right]); // 最后把标杆值移到中间位置,然后返回下标。 return counter; } // 2、归并排序(通过) // 时间复杂度O(logn)。空间复杂度是O(n)。 // 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 // 树,从下往上排序 // 是稳定的算法 void mySort2(vector<int>& arr) { mergeSort(arr, 0, arr.size()-1); } void mergeSort(vector<int> &arr, int left, int right) { if (left >= right) return; int mid = left + (right - left) / 2; mergeSort(arr, left, mid); // 递归 左半边 mergeSort(arr, mid+1, right); // 递归 右半边 merge(arr, left, mid, right); // 合并两个有序的数组(参考合并两个有序的链表) } // 合并两个有序数组 void merge(vector<int> &arr, int left, int mid, int right) { vector<int> tmp(right-left+1); // 开辟新的数组 int i = left, j = mid+1, k = 0; // i左边数组的起始位置,j右边数组的起始位置,k已经放入新数组的个数 while (i <= mid && j <= right) { // 比较左右数组,数值小的放入新数组中 tmp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++]; } while (i <= mid) tmp[k++] = arr[i++]; // 如果左半边数组没有排序完,加入新数组 while (j <= right) tmp[k++] = arr[j++]; // 如果右半边数组没有排序完,加入新数组 for (i = left, k = 0; i <= right;) arr[i++] = tmp[k++]; // 新数组数据放回到原来的数组中 } // 3、堆排序(通过) // 时间复杂度O(logn)。空间复杂度是O(n)。 // 不稳定算法 void heapSort(vector<int> &arr) { priority_queue<int,vector<int>,greater<int>> q; //小顶堆 for (int i = 0; i < arr.size(); i++) { q.push(arr[i]); } for (int i = 0; i < arr.size(); i++) { arr[i] = q.top(); q.pop(); } } // 4、冒泡排序(超时) // 时间复杂度O(n2),空间复杂度O(1) // 从后往前排 // 两两比较交换,最大的放在后面,稳定排序 void bubbleSort(vector<int>& arr) { for (int i = 0; i < arr.size(); i++) { for (int j = 0; j < arr.size()-i-1; j++) { if (arr[j]>arr[j+1]) { swap(arr[j], arr[j+1]); } } } } // 5、选择排序(超时) // 时间复杂度O(n2),空间复杂度O(1) // 从前往后排 // 遍历数组,找出最小值,最小的放在前面,不稳定排序 void selectionSort(vector<int>& arr) { int minIndex = 0; for (int i = 0; i < arr.size(); i++) { minIndex = i; for (int j = i+1; j < arr.size(); j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } swap(arr[i], arr[minIndex]); } } // 6、插入排序(超时) // 时间复杂度O(n2),空间复杂度O(1) // 从前往后排 // 遍历数组,找出一个值,往排好的数组里面插入合适的位置。稳定排序 void insetionSort(vector<int>& arr) { int preIndex = 0; int currentVal = 0; for (int i = 1; i < arr.size(); i++) { preIndex = i - 1; currentVal = arr[i]; while (preIndex >= 0 && arr[preIndex] > currentVal) { arr[preIndex+1] = arr[preIndex]; preIndex--; } arr[preIndex+1] = currentVal; } } };
class Solution: def MySort(self , arr ): # write code here # return self.bubble_sort(arr) # return self.select_sort(arr) # return self.insert_sort(arr) return self.quick_sort(arr) # return self.merge_sort(arr) def bubble_sort(self, arr): # 冒泡排序 不通过 for i in range(len(arr) - 1): for j in range(len(arr) - i - 1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr def select_sort(self, arr): # 选择排序 不通过 for i in range(len(arr)): min_index = i for j in range(i+1, len(arr)): if arr[j] < arr[min_index]: min_index = j arr[min_index], arr[i] = arr[i], arr[min_index] return arr def insert_sort(self, li): # 插入排序 不通过 for i in range(1, len(li)): tmp = li[i] # tmp要插入的之 j = i - 1 while j >= 0 and li[j] > tmp: # 前面的值比tmp大 li[j+1] = li[j] # 前面的值向后移一位 j = j - 1 # 继续向前对比 li[j+1] = tmp # 直到while不满足条件, 也就是前面的值比tmp小, 插入到比tmp小的值后 return li def quick_sort(self, li): # 快速排序 通过 if len(li) < 2: return li else: tmp = li[0] less = [i for i in li[1:] if i <= tmp] more = [i for i in li[1:] if i > tmp] return self.quick_sort(less) + [tmp] + self.quick_sort(more) def merge_sort(self, li): # 归并排序 可能通过 可能不通过 if len(li) < 2: return li else: num = len(li) // 2 left = self.merge_sort(li[:num]) right = self.merge_sort(li[num:]) return self.merge(left, right) def merge(self, left, right): l,r = 0,0 result = [] while l < len(left) and r < len(right): if left[l] < right[r]: result.append(left[l]) l += 1 else: result.append(right[r]) r += 1 result += left[l:] result += right[r:] return result
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @param arrLen int arr数组长度 * @return int整型一维数组 * @return int* returnSize 返回数组行数 */ #include<stdio.h> void Swap(int* p1, int* p2) { int tmp = *p1; *p1 = *p2; *p2 = tmp; } // 冒泡排序会超时 void BuubleSort(int* arr, int arrlen) { for (int i = 0; i < arrlen; i++) { for (int j = 1; j < arrlen; j++) { if (arr[j - 1] > arr[j]) { Swap(&arr[j - 1], &arr[j]); } } } } // 选择排序超时 void SelectSort(int* arr, int arrlen) { int begin = 0; int end = arrlen - 1; while (begin <= end) { int maxi = begin; int mini = begin; for (int i = begin; i <= end; i++) { if (arr[i] > arr[maxi]) { maxi = i; } if (arr[i] < arr[mini]) { mini = i; } } Swap(&arr[begin], &arr[mini]); if (maxi == begin) { maxi = mini; } Swap(&arr[maxi], &arr[end]); end--; begin++; } } //插入排序 (可以通过) void InsertSort(int* arr, int arrlen) { for (int i = 0; i < arrlen - 1; i++) { int end = i; int key = arr[end + 1]; /*while (end >= 0) { while (arr[end] > key) { arr[end + 1] = arr[end]; end--; } arr[end + 1] = key; break; } */ while (end >= 0) { if (arr[end] > key) { arr[end + 1] = arr[end]; end--; } else { break; } } arr[end + 1] = key; } } //希尔排序通过 void ShellSort(int* arr, int arrLen) { int gap = arrLen; while (gap > 1) { gap = gap / 2; for (int i = 0; i < arrLen - gap; i++) { int end = i; int key = arr[end + gap]; while (end >= 0) { if (arr[end] > key) { arr[end + gap] = arr[end]; end -= gap; } else { break; } } arr[end + gap] = key; } } } //挖坑法的快速排序 int PartSort(int* arr, int left, int right) { int pvoit = left; int key = arr[pvoit]; while (left < right) { while (left < right && arr[right] >= key) { right--; } arr[pvoit] = arr[right]; pvoit = right; while (left < right && arr[left] <= key) { left++; } arr[pvoit] = arr[left]; pvoit = left; } arr[pvoit] = key; return pvoit; } void QuickSort(int* arr, int left, int right) { if (left >= right) { return; } int pvoit = PartSort(arr, left, right); QuickSort(arr, left, pvoit - 1); QuickSort(arr, pvoit + 1, right); } //归并排序 void _MergeSort(int* arr, int left, int right, int* tmp) { if (left >= right) { return; } int mid = (left + right) >> 1; _MergeSort(arr, left, mid, tmp); _MergeSort(arr, mid + 1, right, tmp); int begin1 = left; int end1 = mid; int begin2 = mid + 1; int end2 = right; int index = left; while (begin1 <= end1 && begin2 <= end2) { if (arr[begin1] < arr[begin2]) { tmp[index++] = arr[begin1++]; } else { tmp[index++] = arr[begin2++]; } } while (begin1 <= end1) { tmp[index++] = arr[begin1++]; } while (begin2 <= end2) { tmp[index++] = arr[begin2++]; } for (int i = left; i <= right; i++) { arr[i] = tmp[i]; } } void MergeSort(int* arr, int left, int right) { int* tmp = (int*)malloc(sizeof(int) * (right - left + 1)); _MergeSort(arr, left, right, tmp); free(tmp); tmp = NULL; } void AdjustDwon(int* arr, int arrLen, int root) { int parent = root; int child = parent * 2 + 1;//默认是左孩子 while (child < arrLen) { if (child + 1 < arrLen && arr[child + 1] > arr[child]) { child += 1; } if (arr[child] > arr[parent]) { Swap(&arr[child], &arr[parent]); parent = child; child = parent * 2 + 1; } else { break; } } } void HeapSort(int* arr, int arrLen) { //建堆 for (int i = (arrLen - 1 - 1) / 2; i >= 0; i--) { AdjustDwon(arr, arrLen, i); } int end = arrLen - 1; while (end > 0) { Swap(&arr[0], &arr[end]); AdjustDwon(arr, end, 0); end--; } } int* MySort(int* arr, int arrLen, int* returnSize) { // write code here //BuubleSort(arr, arrLen); //SelectSort(arr, arrLen); //InsertSort(arr, arrLen); //ShellSort(arr, arrLen); //MergeSort(arr, 0, arrLen - 1); //HeapSort(arr, arrLen); QuickSort(arr, 0,arrLen - 1); *returnSize = arrLen; return arr; }七大排序:冒泡和选择超时,插入排序。希尔排序。快速排序。归并排序。堆排序
//此代码适用于像我这样的萌新小白们,直接使用数组自带的sort方法排序,代码简洁可读性高, //缺点就是运行时间长,在大佬眼里的破代码哈哈哈。 import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型一维数组 待排序的数组 * @return int整型一维数组 */ public int[] MySort (int[] arr) { // write code here if(arr==null){ return null; } if(arr!=null){ Arrays.sort(arr); } return arr; } }
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 // 快速排序,时间复杂度O(N*logN),空间复杂度O(logN),不稳定 quickSort(arr, 0, arr.length - 1); // 归并排序,时间复杂度O(N*logN),空间复杂度O(N),稳定 // mergeSort(arr); // 堆排序(大根堆),时间复杂度O(N*logN),空间复杂度O(N),不稳定 // heapSort(arr); // 希尔排序,时间复杂度O(N*logN),空间复杂度O(1),不稳定 // shellSort(arr); // 基数排序,时间复杂度O(C*N),C为2*(数值长度+1),空间复杂度O(K+N),K为数值长度,稳定 // baseSort(arr); return arr; } private void quickSort (int[] arr, int left, int right) { if (left < right) { int idx = partition(arr, left, right); quickSort(arr, left, idx - 1); quickSort(arr, idx + 1, right); } } private int partition (int[] arr, int left, int right) { int mark = arr[left]; while (left < right) { while (left < right && arr[right] >= mark) { right--; } if (left < right) { arr[left++] = arr[right]; } while (left < right && arr[left] <= mark) { left++; } if (left < right) { arr[right--] = arr[left]; } } arr[left] = mark; return left; } private void mergeSort (int[] arr) { int[] tmp = new int[arr.length]; mergeSort(arr, 0, arr.length - 1, tmp); } private void mergeSort (int[] arr, int left, int right, int[] tmp) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(arr, left, mid, tmp); mergeSort(arr, mid + 1, right, tmp); merge(arr, left, right, tmp); } } private void merge(int[] arr, int left, int right, int[] tmp) { int mid = left + (right - left) / 2, i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { tmp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++]; } while (i <= mid) { tmp[k++] = arr[i++]; } while (j <= right) { tmp[k++] = arr[j++]; } k = 0; while (left <= right) { arr[left++] = tmp[k++]; } } private void heapSort (int[] arr) { int len = arr.length, buildMaxHeapLoopLimit = arr.length / 2; for (int i = buildMaxHeapLoopLimit; i >= 0; i--) { heapify(arr, i, len); } for (int i = len - 1; i > 0; i--) { swap(arr, i, 0); len--; heapify(arr, 0, len); } } private void heapify (int[] arr, int cur, int len) { int left = 2 * cur + 1, right = 2 * cur + 2, maxIdx = cur; if (left < len && arr[left] > arr[maxIdx]) { maxIdx = left; } if (right < len && arr[right] > arr[maxIdx]) { maxIdx = right; } if (cur != maxIdx) { swap(arr, cur, maxIdx); heapify(arr, maxIdx, len); } } private void shellSort(int[] arr) { for (int step = arr.length / 2; step >= 1; step /= 2) { for (int i = step, tmp, j; i < arr.length; i++) { tmp = arr[i]; j = i - step; while (j >= 0 && arr[j] > tmp) { arr[j + step] = arr[j]; j -= step; } arr[j + step] = tmp; } } } private void baseSort (int[] arr) { List<List<Integer>> bucketList = new ArrayList<>(); // 建立0-9,共10个桶 int baseCount = 10, numSize = 10; for (int i = 0; i < baseCount; i++) { bucketList.add(new ArrayList<>()); } for (int i = 0; i < numSize; i++) { for (int num : arr) { bucketList.get(getBaseNum(num, i)).add(num); } int j = 0; for (List<Integer> bucket : bucketList) { for (Integer num : bucket) { arr[j++] = num; } bucket.clear(); } } // 负数的存在,需使用正/负数桶 List<Integer> posBucket = bucketList.get(0), negBucket = bucketList.get(1); for (int num : arr) { if (num > 0) { posBucket.add(num); } else { negBucket.add(num); } } int idx = 0; for (int i = negBucket.size() - 1; i >= 0; i--) { arr[idx++] = negBucket.get(i); } for (Integer num : posBucket) { arr[idx++] = num; } } private int getBaseNum (int val, int count) { val = Math.abs(val); for (int i = 0; i < count; i++) { val /= 10; } return val %= 10; } private void swap (int[] arr, int x, int y) { int tmp = arr[x]; arr[x] = arr[y]; arr[y] = tmp; } }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 将给定数组排序 * @param arr int整型vector 待排序的数组 * @return int整型vector */ vector<int> MySort(vector<int>& arr) { // write code here quickSort(arr, 0, arr.size()-1); return arr; } void quickSort(vector<int>& arr,int low,int high){ int mid = partition(arr, low, high); if(low<mid-1) quickSort(arr, low, mid-1); if(mid+1<high) quickSort(arr, mid+1, high); } int partition(vector<int>& arr,int low,int high){ int base = arr[low]; while(low<high){ while(low<high&&arr[high]>=base) high--; arr[low] = arr[high]; while(low<high&&arr[low]<=base) low++; arr[high] = arr[low]; } arr[low] = base; return low; } };
class Solution: def MySort(self , arr ): # write code here n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr
class Solution: def MySort(self , arr ): # write code here n = len(arr) for i in range(n): for j in range(1, n-i): if arr[j-1] > arr[j]: arr[j-1], arr[j] = arr[j], arr[j-1] return arr
#include <errno.h> // =================== The begin of function prototype ================== // 归并排序的入口 (Main Entry Point) void merge_sort(const void* __base, const size_t __nmemb, const size_t __size, int (*__cmp) (const void* a, const void* b)); void m_sort(const void* __base, const void* __tmp_base, int l, int r, const size_t __size, int (*__cmp) (const void* a, const void* b)); void merge(const void* __base, const void* __tmp_base, int l, int mid, int r, const size_t __size, int (*__cmp) (const void* a, const void* b)); // =================== The end of function prototype ================== int compare_int(const void* a, const void* b) { return *(int*) a - *(int*) b; } int* MySort(int* arr, int arrLen, int* returnSize) { merge_sort(arr, arrLen, sizeof(int), compare_int); *returnSize = arrLen; return arr; } void merge_sort(const void* __base, const size_t __nmemb, const size_t __size, int (*__cmp) (const void* a, const void* b)) { void* __tmp_base = malloc(__nmemb * __size); if (!__tmp_base) { printf("merge_sort memory overflow: %s\n", strerror(errno)); return; } m_sort(__base, __tmp_base, 0, __nmemb - 1, __size, __cmp); free(__tmp_base); } void m_sort(const void* __base, const void* __tmp_base, int l, int r, const size_t __size, int (*__cmp) (const void* a, const void* b)) { // recursion exit condition if (l >= r) return; int mid = l + ((r - l) >> 1); m_sort(__base, __tmp_base, l, mid, __size, __cmp); m_sort(__base, __tmp_base, mid + 1, r, __size, __cmp); merge(__base, __tmp_base, l, mid, r, __size, __cmp); } void merge(const void* __base, const void* __tmp_base, int l, int mid, int r, const size_t __size, int (*__cmp) (const void* a, const void* b)) { int i = l, j = mid + 1, k = l; while (i <= mid && j <= r) if (__cmp((char*) __base + (i * __size), (char*) __base + (j * __size)) < 0) memcpy((char*) __tmp_base + (k++ * __size), (char*) __base + (i++ * __size), __size); else memcpy((char*) __tmp_base + (k++ * __size), (char*) __base + (j++ * __size), __size); while (i <= mid) memcpy((char*) __tmp_base + (k++ * __size), (char*) __base + (i++ * __size), __size); while (j <= r) memcpy((char*) __tmp_base + (k++ * __size), (char*) __base + (j++ * __size), __size); memcpy((char*) __base + (l * __size), (char*) __tmp_base + (l * __size), (r - l + 1) * __size); }