快速排序的相關實現及改進

2021-07-02 22:16:20 字數 1453 閱讀 8450

啊,快速排序,大名鼎鼎,能稱之為快速的,那就一定有它的道理。那,現在好好學習了一下,看了網上很多版本的實現以及各路教材的講解,還是「挖坑填數」好理解一些,然後左右查詢,使得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...