快速排序及五種優化(模板)

2021-09-01 18:30:44 字數 1751 閱讀 6196

快速排序排序使用分治的思想,通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小。之後分別對這兩部分記錄繼續進行排序,遞迴地以達到整個序列有序的目

(1)選擇基準:

在待排序列中,按照某種方式挑出乙個元素,作為 「基準」

(2)分割操作:

以該基準在序列中的實際位置,把序列分成兩個子串行。此時,在基準左邊的元素都比該基準小,在基準右邊的元素都比基準大

(3)遞迴地對兩個序列進行快速排序,直到序列為空或者只有乙個元素。一般取序列的第乙個或最後乙個元素作為基準基本的快速排序

快排的**實現:

//劃分區間排序

templateint partition(t arr, int startindex, int endindex)

arr[startindex] = key;

return startindex;

}templatevoid quick(t arr, int s, int e)

}templatevoid quicksort(t arr, int len)

templatevoid show(t arr, int len)

std::cout << std::endl;

}int main()

int len = sizeof(arr) / sizeof(arr[0]);

show(arr, len);

std::cout << "---------------------" << std::endl;

quicksort(arr, len);

show(arr, len);

return 0;

}

(1)隨機取基準點 :

若待排序列是部分有序時,固定選取基準使快排效率底下,取待排序列中任意乙個元素作為基準

**實現:

int arr[30];

for (int i = 0; i < 30; i++)

int len = sizeof(arr) / sizeof(arr[0]);

(2)三數取中(優化有序的資料):

對待排序序列中low、mid、high三個位置上資料進行排序,取中間的那個資料作為基準,並用0下標元素儲存基準。

**實現:

template//三數取中

void findmiddlenumber(t arr, int left, int mid, int right)

if (arr[left] > arr[right])

if (arr[left] < arr[mid])

}

(3)小資料的優化 用插入排序 ,最優情況o(n)

對於很小和部分有序的陣列,快排不如插排好。當待排序序列的長度分割到一定大小後,繼續分割的效率比插入排序要差,此時可以使用插排而不是快排

**實現:

template//插入排序

void insertsort(t arr, int startindex, int endindex)

arr[j + 1] = tmp;

}}

(4)聚集優化

重複資料的優化(資料量大,數值小,離散程度小)

(5)非遞迴優化

沒有開棧,清棧,開銷小

**實現:

//非遞迴快排

if (s < e)

if (boundindex + 1 < right)

}}}

快速排序優化演算法 五種 c

快排優化 2.聚集元素 3.尾遞迴優化 4.插入排序處理小陣列 快排演算法是基於分治策略的排序演算法,其基本思想是,對於輸入的陣列a low,high 按以下兩個步驟進行排序 1 劃分 以a p 為基準將a low high 劃分為三段a low p 1 a p 和a p 1 high 使得a lo...

快速排序的五種優化(高頻面試)

void quick sort v1 int arr,int l,int r arr x z quick sort v1 arr,l,x 1 quick sort v1 arr,x 1,r return 單邊遞迴法 quick sort v2 單邊遞迴法將一側交給遞迴函式實現,另一側交給本層函式實現...

五種排序演算法 快速排序

1 在陣列中選乙個基準數 通常為陣列第乙個 2 將所有比基準值小的值擺放在基準的前面,所有比基準值大的擺放在基準的後面 相同的數可以放到任意一邊 在這個分割槽推出之後,該基準就處於數列的中間位置。3 遞迴地把 基準值前面的子數列 和 基準值後面的子數列 進行排序。下面以數列a 30,40,10,20...