啊,快速排序,大名鼎鼎,能稱之為快速的,那就一定有它的道理。那,現在好好學習了一下,看了網上很多版本的實現以及各路教材的講解,還是「挖坑填數」好理解一些,然後左右查詢,使得pivot的左邊比它小,右邊的數比它大;這個函式一般叫做partition 函式,在很多場景用得上,比如還有乙個求陣列前k大數,或後k大數,都可以用這個函式實現。那麼快速排序的思想就不多說了,分治,交換。哦,忘了最後補充下,改進方法就是用尾遞迴方法,減少遞迴空間和遞迴呼叫的時間。
尾遞迴是針對傳統的遞迴演算法而言的, 傳統的遞迴演算法在很多時候被視為洪水猛獸。 它的名聲狼籍,好像永遠和低效聯絡在一起。尾遞迴就是從最後開始計算, 每遞迴一次就算出相應的結果, 也就是說, 函式呼叫出現在呼叫者函式的尾部, 因為是尾部, 所以根本沒有必要去儲存任何區域性變數. 直接讓被呼叫的函式返回時越過呼叫者, 返回到呼叫者的呼叫者去.
實驗**如下:
// quick_sort.cpp : 定義控制台應用程式的入口點。
/* @mishidemudong
@2015-5-28
*///
#include "stdafx.h"
#include#include#include#includeusing namespace std;
int patition(int a, int start, int end)
while (i < j&&a[i] < x)i++;//從左到右查詢比x大的書來填a[j]
if (i < j)
}a[i] = x;
return i;
}void quick_sort(int s , int left, int right) }
/*尾遞迴方法改進快速排序;
*/void quick_sort_tailrecusion(int s, int left, int right)
}int cmp(const void *a, const void *b)
/*簡潔版快速排序演算法*/
void quick_sort1(int s, int l, int r)
s[i] = x;
quick_sort1(s, l, i - 1); // 遞迴呼叫
quick_sort1(s, i + 1, r); }}
int _tmain(int argc, _tchar* argv)
//quick_sort1(a, 0, n-1);
//qsort(a, n, sizeof(a[0]),cmp); //stl的快速排序函式;
quick_sort(a,0,n-1);
//quick_sort_tailrecusion(a, 0, n-1);
for (int i = 0; i < n;i++)
printf("%3d ", a[i]);
delete a;
return 0;
}
排序演算法 快速排序(及小改進)
排序演算法 快速排序 常見版 演算法思想 每次都將第乙個資料放到它本應該在的位置 include using namespace std template 泛型程式設計改進 注意這句話要寫在函式的前面 具體怎麼分治 intsort t arr,int left,int right swap arr ...
快速排序的改進
改寫partition演算法。要求 一次partition之後,小於基準元素key的數在左邊,等於key的在中間,大於key的在右邊 思路一 參照演算法導論上的思想,做出改進 i指向小於基準元素的序列的末尾,j指向等於基準元素的序列的末尾,k指向當前遍歷到的元素。include include us...
快速排序的改進
快速排序最壞情況下,要比較o n 2 次,但平均效能為nlogn,基本達到了比較類排序所需時間的的下界。核心 為 void qsort int data,int begin,int end int pivot,i,j if begin end return i begin j end pivot d...