一.概述
二.原理
三.快速排序的優化
3.2優化不必要的交換
四.對小陣列的優化
五.快速排序完整**
#include #include using namespace std;
#define maxsize 10
#define n 9
#define max_length_insert_sort 7 // 快速排序設定的閾值
typedef struct
sqlist;
void show(sqlist l)
void swap(sqlist *l, int i, int j)
// 確定主元
int partition(sqlist *l, int low, int high)
return low;
}// 快速排序
void qsort(sqlist *l, int low, int high)
}// 統一函式介面
void quicksort(sqlist *l)
// 快速排序的優化
int partition1(sqlist *l, int low, int high)
l->r[low] = l->r[0]; // 將暫存的主元替換回l->r[row]
return low; // 返回主元的位置
}// 直接插入排序
void insertsort(sqlist *l)}}
// 因為快速排序適合由於待排序的序列很大的情況,所以設定乙個閾值
void qsort1(sqlist *l, int low, int high)
else
}// 由於qsort1()函式在其尾部有兩次的遞迴操作,如果待排序的序列劃分極不平衡時,遞迴深度將趨於n,浪費棧空間
// 使用尾遞迴
void qsort2(sqlist *l, int low, int high)
}else
}// 統一函式介面:改進後的快速排序
void quicksort1(sqlist *l)
// 統一函式介面:改進後的快速排序使用尾遞迴
void quicksort2(sqlist *l)
int main()
;for (int i = 0; i < n; i++)
l.r[i + 1] = d[i];
l.len = n;
cout << "快速排序前: ";
show(l);
cout << "快速排序後: ";
quicksort(&l);
show(l);
cout << "改進的快速排序後: ";
quicksort1(&l);
show(l);
cout << "改進的快速排序(尾遞迴)後: ";
quicksort2(&l);
show(l);
return 0;
}
#include #include #include using namespace std;
// (小數,基準元素,大數)。在區間中隨機挑選乙個元素作基準,將小於基準的元素放在基準之前,大於基準的元素放在基準之後,再分別對小數區與大數區進行排序。
// 快速排序思路:
// 1. 選取第乙個數為基準
// 2. 將比基準小的數交換到前面,比基準大的數交換到後面
// 3. 對左右區間重複第二步,直到各區間只有乙個數
// 遞迴方法實現
void quicksort(vector& v, int low, int high)
if(first < last)
while(first < last && v[first] <= key)
if(first < last)
}// 基準位置
v[first] = key;
quicksort(v, low, first-1); // 前半部分遞迴
quicksort(v, first+1, high); // 後半部分遞迴
}// 最後乙個元素作為主元
templatevoid quicksortrecursivecore(t arr, int start, int end)
while(arr[right] >= mid && left < right)
swap(arr[left], arr[right]);
}if(arr[left] >= arr[end])
else
quicksortrecursivecore(arr, start, left-1);
quicksortrecursivecore(arr, left+1, end);
}templatevoid quicksortrecursive(t arr, int len)
六、快速排序時間複雜度總結: 快速排序演算法的遞迴實現的個人理解
關於快速排序,該演算法實現原理是將要排序的一組資料根據乙個被選中的資料,以這個資料為中心將資料分成兩側,一側大一側小,使用遞迴,將分好的兩組資料分別進行再次分組,直至不能再分,這時排序則排序完畢。因此快速排序演算法的中心應該是如何根據選中的資料將資料分成兩組,而這裡這個選中的資料則直接預設為資料組的...
快速排序演算法思想
一 快速排序遞迴演算法 1 對下列採用快速排序 2 可以把最左邊 4 作為基數 然後分別從兩邊出發進行檢索 一定要從右邊開始 如果從左邊開始的話等下結果為 53241 因為我們要使左邊的數小於基數 從左邊開始 我們檢索是在大於基數那個位置停止 這時和基數交換 使左邊的數大於基數 導致結果出錯 首先要...
排序演算法思想記錄 快速排序演算法
思路 選取陣列中任意乙個數字作為對比位pivot,然後定義兩個指標位left right,分別從陣列開始和結束位置向內掃瞄,每次先動乙個指標位,如right遇到小於pivot的值,將該值存放到左指標處,接著左指標向內位移,遇到大於pivot的值存放至右指標處,依次迴圈到left與right重合,則完...