日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构-排序】4.图解归并排序和基数排序

發布時間:2025/3/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构-排序】4.图解归并排序和基数排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歸并排序

排序思想

歸并排序就是將兩個或兩個以上的有序表組合成一個新的有序表

從代碼結構來看,歸并排序類似樹的后序遍歷 —— (參考快速排序,類似樹的先序遍歷




歸并排序算法分析

歸并排序的時間復雜度是 O(nlogn),由于我采用的方式是下標元素的交換,所以沒有用到輔助空間,因此空間復雜度是 O(1),同時也是 穩定排序, 由于它是一種分治思想,所以它的元素 不是全局有序 的。

代碼實現

class Solution{ public:int counter = 0;int ans[7] = {23,76,34, 89, 90,34,56};void mergeSort(int low, int high) {if(low>=high) return;int mid = (low + high) / 2;mergeSort(low,mid);mergeSort(mid+1,high);mergeTwoList(low,mid,high);return;} private:void mergeTwoList(int low, int mid, int high) {int i = low;int j = mid+1;int tmp[10] = {0};int flag = low;while(i<=mid&&j<=high) {if(ans[i]<ans[j]) {tmp[flag++] = ans[i++];} else {tmp[flag++] = ans[j++];}}while(i<=mid) tmp[flag++] = ans[i++];while(j<=high) tmp[flag++] = ans[j++];for(int k = low; k <= high; k++) {ans[k]=tmp[k];}return;} };

加工后執行的結果



基數排序

排序思想

基數排序不基于比較進行排序,而是采用多關鍵字的排序思想。也就是說基數排序實際上是關于關鍵字各位的的大小排序的。

通過示例解釋一下

以下 nums[0,6] 的個位數依次為 {6, 6, 4, 9, 0, 4, 6} ,按這個依據從小到大排序,{90, 34, 34, 6, 76, 56, 189}


以上 nums[0,6] 的十位數依次為 {9, 3, 3, 0, 7, 5, 8},按這個依據從小到大排序,{6, 34, 34, 56, 76, 189, 90}


以上 nums[0,6] 的百位數依次為 {0, 0, 0, 0, 0, 1, 0},按這個依據從小到大排序,{6, 34, 34, 56, 76, 90, 189}


基數排序算法分析

基數排序的時間復雜度是 O(dn),也就是需要精心 d 趟分配,一趟分配和收集需要 O(n),空間復雜度是 O(10n),同時也是 穩定排序, 但 不是全局有序 的。

代碼實現

class Solution{ public:void radixSort(vector<int> nums) {vector<vector<int> > tmp;vector<int> list;int anchor = 1;int counter = 0;// lgchor + 1趟排序while(anchor) {tmp.clear();// 需要輔助數列for(int j = 0; j < 10; j++) {list.clear();list.push_back(j);tmp.push_back(list);}int i = 0; // 按關鍵字各個位數排序while(i<7) {int rest = nums[i] % (anchor * 10);int radix = rest / anchor;tmp[radix].push_back(nums[i++]);}// 放在一個列表中nums.clear();for(int j = 0; j < 10; j++) {for(int k = 1; k < tmp[j].size(); k++) {nums.push_back(tmp[j][k]);}if(tmp[j].size()==7) anchor=0;} anchor *= 10;}return;} };

加工后執行的結果



歸并排序測試代碼

#include <stdio.h> #include <vector> using namespace std;class Solution{ public:int counter = 0;int ans[7] = {23,76,34, 89, 90,34,56};void mergeSort(int low, int high) {if(low>=high) return;int mid = (low + high) / 2;mergeSort(low,mid);mergeSort(mid+1,high);mergeTwoList(low,mid,high);printf("第%d輪:", counter++);for(int j = 0; j < 7; j++) {printf(" %d ",ans[j]);if(j!=6) printf(",");}printf("\n");return;} private:void mergeTwoList(int low, int mid, int high) {int i = low;int j = mid+1;int tmp[10] = {0};int flag = low;while(i<=mid&&j<=high) {if(ans[i]<ans[j]) {tmp[flag++] = ans[i++];} else {tmp[flag++] = ans[j++];}}while(i<=mid) tmp[flag++] = ans[i++];while(j<=high) tmp[flag++] = ans[j++];for(int k = low; k <= high; k++) {ans[k]=tmp[k];}return;} };int main() {Solution solution;solution.mergeSort(0,6);return 0; }

基數排序測試代碼

#include <stdio.h> #include <vector> using namespace std;class Solution{ public:void radixSort(vector<int> nums) {vector<vector<int> > tmp;vector<int> list;int anchor = 1;int counter = 0;while(anchor) {tmp.clear();for(int j = 0; j < 10; j++) {list.clear();list.push_back(j);tmp.push_back(list);}int i = 0; // 第一輪排序while(i<7) {int rest = nums[i] % (anchor * 10);int radix = rest / anchor;tmp[radix].push_back(nums[i++]);}// 放在一個列表中nums.clear();for(int j = 0; j < 10; j++) {for(int k = 1; k < tmp[j].size(); k++) {nums.push_back(tmp[j][k]);}if(tmp[j].size()==7) anchor=0;} anchor *= 10;printf("第%d輪:", counter++);for(int j = 0; j < nums.size(); j++) {printf("%d",nums[j]);if(j!=nums.size()-1) printf(",");}printf("\n");}return;} };int main() {vector<int> v;v.push_back(6);v.push_back(76);v.push_back(34);v.push_back(189);v.push_back(90);v.push_back(34);v.push_back(56);Solution solution;solution.radixSort(v);return 0; }

總結

以上是生活随笔為你收集整理的【数据结构-排序】4.图解归并排序和基数排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。