LeetCode 912. 排序数组(10种排序)
文章目錄
- 1. 題目
- 2. 解題
- 2.1 插入排序
- 2.2 冒泡排序
- 2.3 選擇排序
- 2.4 希爾排序
- 2.5 歸并排序
- 2.6 快速排序
- 2.7 堆排序
- 2.8 計數(shù)排序
- 2.9 桶排序
- 2.10 基數(shù)排序
- 3. 復(fù)雜度表
1. 題目
給你一個整數(shù)數(shù)組 nums,將該數(shù)組升序排列。
示例 1: 輸入:nums = [5,2,3,1] 輸出:[1,2,3,5]示例 2: 輸入:nums = [5,1,1,2,0,0] 輸出:[0,0,1,1,2,5]提示: 1 <= nums.length <= 50000 -50000 <= nums[i] <= 50000來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/sort-an-array
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
2. 解題
基礎(chǔ)的排序算法,寫一遍復(fù)習(xí)一下。
參考我的博客:
10種C++排序算法
快速排序quicksort算法優(yōu)化
快速排序quicksort算法細(xì)節(jié)優(yōu)化(一次申請內(nèi)存/無額外內(nèi)存排序)
2.1 插入排序
class Solution { public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j;for(i = 0; i < arr.size(); ++i){for(j = i; j > 0; --j){if(arr[j-1] > arr[j])swap(arr[j-1],arr[j]);elsebreak;}}return arr;} };9 / 10 個通過測試用例,超時
2.2 冒泡排序
class Solution { public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j;bool arrSorted = false;for(i = 0; i < arr.size(); ++i){arrSorted = true;for(j = 1; j <= arr.size()-1-i; ++j){if(arr[j-1] > arr[j]){swap(arr[j-1],arr[j]);arrSorted = false;}}if(arrSorted)break;}return arr;} };超時
2.3 選擇排序
class Solution { //選擇 public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j, minIdx = 0;for(i = 0; i < arr.size()-1; ++i){minIdx = i;for(j = i+1; j < arr.size(); ++j){if(arr[minIdx] > arr[j])minIdx = j;}swap(arr[i],arr[minIdx]);}return arr;} };超時
2.4 希爾排序
class Solution { //希爾 public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j, gap = 1;for(gap = arr.size()/2; gap > 0; gap /= 2){for(i = gap; i < arr.size(); ++i){for(j = i; j-gap >= 0 && arr[j-gap]>arr[j]; j -= gap)swap(arr[j-gap],arr[j]);}}return arr;} };72 ms 15.8 MB
2.5 歸并排序
class Solution { //歸并vector<int> temp; public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;temp.resize(arr.size());mergeSort(arr,0, arr.size()-1);return arr;}void mergeSort(vector<int>& arr, int l, int r){if(l == r)return;int mid = l+((r-l)>>1);mergeSort(arr,l,mid);mergeSort(arr,mid+1,r);merge(arr,l,mid,r);}void merge(vector<int>& arr, int l, int mid, int r){int i = l, j = mid+1, k = 0;while(i <= mid && j <= r){if(arr[i] <= arr[j])temp[k++] = arr[i++];elsetemp[k++] = arr[j++];}while(i <= mid)temp[k++] = arr[i++];while(j <= r)temp[k++] = arr[j++];for(k = 0, i = l; i <= r; ++i,++k)arr[i] = temp[k];} };52 ms 16 MB
2.6 快速排序
class Solution { //快排 public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;qsort(arr,0, arr.size()-1);return arr;}void qsort(vector<int>& arr, int l, int r){if(l >= r)return;int Pl = l, Pr = l;partition(arr,l,r,Pl,Pr);qsort(arr,l,Pl-1);qsort(arr,Pr+1,r);}void partition(vector<int>& arr, int l, int r, int& Pl, int& Pr){ selectMid(arr,l,r);int P = arr[l];int i = l, j = r;while(i < j){while(i < j && P < arr[j])//沒有等于號,哨兵都在左側(cè)j--;swap(arr[i], arr[j]);while(i < j && arr[i] <= P)i++;swap(arr[i], arr[j]);}Pl = Pr = i;for(i = i-1; i >= l; --i)//聚集左側(cè)與哨兵相等的到中間{if(arr[i] == P){Pl--;swap(arr[i], arr[Pl]);}}}void selectMid(vector<int>& arr, int l, int r){int mid = l+((r-l)>>1);if(arr[mid] > arr[r])swap(arr[mid],arr[r]);if(arr[l] > arr[r])swap(arr[l], arr[r]);if(arr[mid] > arr[l])swap(arr[mid], arr[l]);} };52 ms 15.6 MB
96 ms 15.8 MB(刪除聚集哨兵操作后的用時)
2.7 堆排序
class Solution { //堆排序, 建堆(升序建大堆,降序建小堆) public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;for(int i = arr.size()/2-1; i >= 0; --i)adjust(arr,i,arr.size());//建堆for(int i = arr.size()-1; i >= 0; --i){swap(arr[i],arr[0]);adjust(arr,0,i);}return arr;}void adjust(vector<int>& arr, int i, int len){int lchild = 2*i+1, rchild = 2*i+2, maxIdx = i;while(lchild < len){if(lchild < len && arr[lchild] > arr[maxIdx])maxIdx = lchild;if(rchild < len && arr[rchild] > arr[maxIdx])maxIdx = rchild;if(maxIdx != i){swap(arr[i],arr[maxIdx]);lchild = 2*maxIdx+1;rchild = lchild+1;i = maxIdx;}elsebreak;}} };72 ms 15.8 MB
2.8 計數(shù)排序
class Solution { //計數(shù)排序 public:vector<int> sortArray(vector<int>& arr) {if(arr.size() <= 1)return arr;int i, j = 0, min, max;min = max = arr[0];for(i = 1; i < arr.size(); ++i){min = arr[i] < min ? arr[i] : min;max = arr[i] > max ? arr[i] : max;}const int N = max-min+1;vector<int> count(N,0);for(i = 0; i < arr.size(); ++i)count[arr[i]-min]++;for(i = 0; i < N; ++i){while(count[i]--)arr[j++] = i+min;}return arr;} };36 ms 16.1 MB
2.9 桶排序
- 數(shù)據(jù)裝桶,桶內(nèi)快排
40 ms 16.3 MB
2.10 基數(shù)排序
- 注意處理負(fù)數(shù),被坑了,負(fù)數(shù)%后越界,window不報錯盡然。。
56 ms 16 MB
3. 復(fù)雜度表
圖片參考 https://leetcode-cn.com/problems/sort-an-array/solution/shi-er-chong-pai-xu-suan-fa-bao-ni-man-yi-dai-gift/
r 為排序數(shù)字的范圍,d 是數(shù)字總位數(shù),k 是數(shù)字總個數(shù)
總結(jié)
以上是生活随笔為你收集整理的LeetCode 912. 排序数组(10种排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1391. 检查网格中
- 下一篇: LeetCode 1347. 制造字母异