快速排序採用的是分治法,其平均時間複雜度為o(nlogn)
一趟快速排序的演算法是[1]:
1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;
2)以第乙個陣列元素作為關鍵資料,賦值給
key,即
key=a[0];
3)從j開始向前搜尋,即由後開始向前搜尋(j=j-1即j--),找到第乙個小於
key的值a[j],a[j]與a[i]交換;
4)從i開始向後搜尋,即由前開始向後搜尋(i=i+1即i++),找到第乙個大於
key的a[i],a[i]與a[j]交換;
5)重複第3、4、5步,直到 i=j; (3,4步是在程式中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指標位置不變。另外當i=j這過程一定正好是i+或j-完成的最後另迴圈結束。)
下面的**用了兩種不同的演算法實現快速排序演算法,第一種是上面提到的快排演算法,第二種是演算法導論上的版本。
//#include "stdafx.h"
#include using namespace std;
//快速排序演算法
template void quicksort(t*, int, int);
//快排另一種演算法
template int partition(t*, int, int, int);
template void quicsortsec(t*, int, int, int);
template void swap(t&, t&);
int _tmain(int argc, _tchar* argv)
; int length = sizeof(arr) / sizeof(int);
cout << "before quick sort:" << endl;
for (int i = 0; i < length;i++)
cout << endl;
//quicksort(arr, 0, length - 1);
quicsortsec(arr, length, 0, length - 1);
cout << "after quick sort:" << endl;
for (int i = 0; i < length;i++)
cout << endl;
return 0;
}template void quicksort(t* a, int left, int right)
while (i < j && a[i] < key)
++i;
if (i < j)
}a[i] = key;
//遞迴呼叫
quicksort(a, left, i - 1);
quicksort(a, i + 1, right); }}
template void quicsortsec(t* a, int legth, int left, int right)
template int partition(t* a, int legth, int left, int right)
} }++small;
swap(a[small], a[right]);
return small;
}template void swap(t &a, t &b)
快速排序演算法 c 實現
namespace backpackproblem backpack bp new backpack profit int start 0 int end profit.length 1 bp.quicksort profit,start,end bp.print class backpack 快速...
快速排序演算法C 實現
經常看到有人在網上發快速排序的演算法,通常情況下這些人是在準備找工作,或者看 演算法導論 這本書,而在他們發布的 通常是差不多的版本,估計也是網上 copy 一下,自己改改,跑過了就算了,但是通常這樣玩根本沒有太大作用,如果到一家公司,給你一台不能上網的筆記本,20分鐘,你是根本寫不出來快速排序的演...
快速排序演算法C 實現
quick sort stl中也有現成的快速排序演算法,內部實現採用了以下技巧 1 樞軸的選擇採取三數取中的方式 2 後半段採取迴圈的方式實現 3 快速排序與插入排序結合 include include includeusing namespace std 這一版本是最簡單實現版本,對於快速排序的優...