C++基礎練習:分治法排序代碼

C++基礎練習:分治法排序代碼

4 人贊了文章

#include<iostream>void recur(int*, int);using namespace std;int main(void){ int arr[20] = { 41, 1, 23, 9, 6, 8, 13, 60, 32, 45, 77, 21, -5, 7, 5, 44, 0, 25, 17, 2};//測試用數組 recur(arr, 20); for (int i = 0; i < 20; i++) { cout << "arr[" << i << "]=" << arr[i] << endl;//輸出測試結果 } cin.get(); return 0;}void recur(int* arr, int size){ const int size1 = size / 2 + size % 2;//求出第一個子數組的長度 int* arr1 = new int[size1];//給第一個子數組分配動態內存 for(int i = 0; i< size1; i++) { *(arr1 + i) = *(arr + i);//第一個子數組從父數組中獲取數據 } if (size1 > 1)//如果第一個子數組的長度大於1 recur(arr1, size1);//將子數組作為父數組,繼續細分 const int size2 = size / 2;//求出第二個子數組的長度 int* arr2 = new int[size2];//第二個子數組同理 for (int i = 0; i< size2; i++) { *(arr2 + i) = *(arr + size1 + i); } if (size2 > 1) recur(arr2, size2); for (int i = 0, j = 0;;)//當子數組的值尚未被取盡時,判斷語句放在函數體內 { if(arr1[i]>arr2[j])//若第一個子數組的當前值大於第二個子數組 { arr[i + j] = arr2[j];//父數組的當前值取第二個子數組的當前值 j++;//第二子數組的指針向前移動一格 if(j==size2)//如果指針已抵達末尾 { for (; i + j < size; i++)//用第一個子數組的指針將第一個子數組中剩下的部分取盡 { arr[i + j] = arr1[i]; } } } else//否則同理 { arr[i + j] = arr1[i]; i++; if(i==size1) { for (; i + j < size; j++) { arr[i + j] = arr2[j]; } } } } delete[] arr1;//子數組的數據已被父數組錄用完畢,釋放子數組的內存空間 delete[] arr2;}

測試無誤。求指正/優化指導。謝謝!


推薦閱讀:

有哪些優秀的 C++ 代碼庫可以推薦學習?
C++的右值引用有坑嗎?
C++ 有趣在哪?
為什麼好多人說C++代碼丑?
C++中使用模板獲取數組長度時,數組名前的那個&是什麼意思呢?

TAG:數據結構 | 編程語言 | 編程 | C |