C++ 用迭代的方式实现归并排序
生活随笔
收集整理的這篇文章主要介紹了
C++ 用迭代的方式实现归并排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
歸并排序
思路如下:(用一個別人個圖)
兩天加在一起寫了三個小時才寫出來,思路比較亂,簡單的歸并排序讓我給寫復雜了,代碼里能看出來好多修補bug的痕跡。
自己生成了幾個測試用例,用666、500、100個數(shù)都試了試,排序結(jié)果沒有問題。
應(yīng)該沒什么bug吧
代碼
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() {int n;cin >> n;vector<int> arr1;int t;int i;for (i = 0; i < n; i++){cin >> t;arr1.push_back(t);}vector<int> temp;int j1, j2;int part = 0;//第幾段int curPush = 0;for (i = 1; i < n; i *= 2)//i表示當前連續(xù)i個數(shù)字有序{part = 0;//正在對第part部分排序for (j1 = 0, j2 = 0; j1 < i || j2 < i; ){if ((part + 1)*i + j2 >= n)//對于將要比較的兩段來說,如果后一段的第一項就超出了vector范圍,說明后一段不存在,也就是不足以構(gòu)成兩段。因此把前一段的所有元素都一個個挨著push進去{for (int t = 0; part*i + j1 + t < n; t++)//push的過程{temp.push_back(arr1[part*i + j1 + t]);if (temp.size() == n)break;}break;}if (arr1[part*i + j1] < arr1[(part + 1)*i + j2])//正在比較的兩項{temp.push_back(arr1[part*i + j1]);curPush++;j1++;}else if (arr1[part*i + j1] >= arr1[(part + 1)*i + j2])//正在比較的兩項{temp.push_back(arr1[(part + 1)*i + j2]);curPush++;j2++;}if (j1 >= i || j2 >= i)//當比較兩部分時,如果其中一部分已經(jīng)全部push進去了,那么就把另外一部分一個一個挨著push進去{for (; j1 < i; j1++){if (temp.size() == n)break;temp.push_back(arr1[part*i + j1]);curPush++;}for (; j2 < i; j2++){if (temp.size() == n)break;temp.push_back(arr1[(part + 1)*i + j2]);curPush++;}part += 2;//對后兩部分排序j1 = 0;j2 = 0;curPush = 0;}}//復制for (int k = 0; k < n; k++){arr1[k] = *temp.begin();temp.erase(temp.begin());}}//輸出歸并排序結(jié)果cout << "你的排序:" << endl;for (int k = 0; k < n; k++){cout << arr1[k] << " ";}cout << endl;//輸出自帶sort函數(shù)排序結(jié)果cout << "答案:" << endl;sort(arr1.begin(), arr1.end());for (int k = 0; k < n; k++){cout << arr1[k] << " ";}cout << endl;system("pause"); }總結(jié)
以上是生活随笔為你收集整理的C++ 用迭代的方式实现归并排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网_PAT乙级_1025插入与归并(
- 下一篇: C++ KMP算法之next数组的生成