1.快速排序是最最基本的排序算法之一,時間復雜度是O(nlog2(n))
基本思想:分治法+遞歸
假設key為該序列的第一個元素,從后往前遍歷,找到第一個小於key值的元素,將該元素賦值給左邊的起始值,再從前往后遍歷,找到第一個大於key值的元素,將其賦值給剛才右邊第一個小於key值的值,當low<high,則不斷遞歸,知道有序為止.
在用數組int num[]和C++的vector傳遞地址時,vector需要傳引用,否則,沒法得到正確地址,因為vector本質上是一個類對象,因此傳值會得不到正確結果,而數組會退化為指針,因此可以直接傳值.
template<typename datatype> void myquicksort(vector<datatype> &vec, int low, int high)//必須傳引用,否則出錯,因為vector是一個類對象 { if (low < high) { int l = low; int r = high; datatype key = vec[l];//記錄key值 while (l < r) { while (l < r&&key <= vec[r])//從右往左遍歷,找到第一個小於key的元素 --r; vec[l] = vec[r]; while (l < r&&key >= vec[l])//從左往右遍歷,找到第一個大於key值的元素 ++l; vec[r] = vec[l]; } vec[l] = key;//其實此時l=r myquicksort(vec, low, l-1); myquicksort(vec, r + 1, high); } } int main2() { const int len = 30;//定義一個常量 vector<int>data;//創建一個vector,存儲int類型的元素 for (int i = 0; i < len; i++) { data.push_back(rand() % 100); cout << (data.at(i)) << "\t"; if ((i + 1) % 10 == 0) cout << endl; } clock_t start = clock();//使用clock函數需要包含頭文件#include<ctime> myquicksort(data, 0, len - 1); clock_t end = clock(); cout << "排序完成,總共用時:" << (end - start)*1.0 / CLOCKS_PER_SEC << endl;//#define CLOCKS_PER_SEC 1000 for (int i = 0; i < len; i++) { cout << (data.at(i)) << "\t"; if ((i + 1) % 10 == 0) cout << endl; } system("pause"); return 0; }
2.使用數組來傳值:
void myquicksort2(int a[], int low, int high)//數組作為函數參數,沒有副本機制,退化為指針 { if (low >= high)//遞歸終止條件 return; else { int l = low, h = high; int key = a[l]; while (l<h) { while (l < h&&a[h] >= key) --h; a[l] = a[h]; while (l < h&&a[l] <= key) ++l; a[h] = a[l]; } a[l] = key; myquicksort2(a, low, l - 1); myquicksort2(a, l + 1, high); } } int main() { const int len = 30; int num[len]; for (int i = 0; i < len; i++) { num[i] = rand() % 100; cout << num[i] << "\t"; if ((i + 1) % 10 == 0) cout << endl; } clock_t t1 = clock(); myquicksort2(num, 0, len - 1); clock_t t2 = clock(); cout << "排序完成,總共用時:" << (t2 - t1)*1.0 / CLOCKS_PER_SEC << endl; for (int i = 0; i < len; i++) { cout << num[i] << "\t"; if ((i + 1) % 10 == 0) cout << endl; } system("pause"); return 0; }