論秋招中的排序 排序法彙總 中篇

2022-03-22 20:47:46 字數 2720 閱讀 6034

續論秋招中的排序(排序法彙總-------上篇)(由於篇幅過大),下面我們繼續學習。

論秋招中的排序(排序法彙總-------上篇)

論秋招中的排序(排序法彙總-------中篇)

待續(原創,**須註明原處)

5、快速排序

快速排序在面試中經常被問到(包括各種改進思路),此排序演算法可以說是用得最為廣泛的排序演算法,是對氣泡排序的一種改進,每次交換是跳躍式的。其比較易於實現,同時它可以處理多種不同的輸入資料,許多情況下所消耗的資源也較其他排序演算法少。理想情況下,其只使用乙個小的輔助棧,對n個資料項排序的平均時間複雜度為o(nlogn),並且它內部的迴圈很小,缺點就是不穩定的排序演算法,在最壞的情況下時間複雜度為o(n^2)。其實過程很簡單,想想就明白了,所以不想再細說,**比語言更明確更精準,下面給出一輪劃分的**,接著遞迴兩邊的部分即可,圖如下:

即劃分後,key=32的最終位置的左邊的所有資料值都小於(或等於)key,右邊的所有資料值都大於(或等於)key。

**如下:

int partion(int a, int left, int right)//

劃分操作

a[lleft] =key;

return lleft;//

key的最終位置

}

遞迴:

void qsort(int a, int left, int

right)

非遞迴:

void qsort(int a, int left, int

right)

if (mid + 1

while (!st.empty()) //如果棧不為空,即排序未結束

if (mid + 1}}

}

在最壞的情況下,如果要排序的序列是有序的,則快速排序將退化為氣泡排序,時間複雜度變為o(n^2);在最好的情況下,每次劃分過程都恰好把檔案分割成兩個大小完全相等的部分,則時間複雜度為o(nlogn)。

改進演算法:

上面我們也提到了,在最壞的情況下,如果待排序列已經有序了,則快排會變得非常低效。下面將會介紹改進的方法:

1、選取隨機數作為樞軸。但是隨機數的生成本身是一種代價,根本減少不了演算法其餘部分的平均執行時間。2、使用左端,右端和中心的中值做為樞軸元(即三者取中)。3、每次選取資料集中的中位數做樞軸。

改進**:

void exchange(int*a, int *b)

void compexch(int* a, int*b)

int partion(int a, int left, int right)//

劃分操作

a[lleft] =key;

return lleft;//

key的最終位置

}void quicksort(int a, int left, int right) //

小區域排序採用插入排序方法(對於有序序列的排序效率較高o(n)),三者取中

inti;

i =partion(a, left, right);

quicksort(a, left, i - 1

); quicksort(a, i + 1

, right);

}

下面我們繼續考慮另外方面的改進,當待排序的序列中有大量的重複元素時,標準的快排又變得極其低效(哎呀,問題怎麼這麼多啊,煩不煩啊。。。。)。嘿嘿,當然,有解決的方法了,最直觀的想法是將序列劃分為三部分(三路劃分)而不再是兩部分了,即比劃分元素小的部分、比劃分元素大的部分和與劃分元素相等的部分。

三路劃分僅僅在標準的快排下稍作改動:遍歷時將遇到的左邊區域中的與劃分元素相等的元素放到序列的最左邊,將遇到的右邊區域中的與劃分元素相等的元素放到序列的最右邊。繼而,當兩個掃瞄的指標相遇時,序列中與劃分元素相等的元素的位置就精確定位了。對於重複的元素的額外工作量只與所找到的重複的元素的個數呈線性相關;即使在沒有重複的元素的情況下,在方法沒有額外的開銷,效果也很好。

小區域排序採用插入排序方法,三者取中,三路劃分

int mid = (left + right) / 2

; compexch(&a[left], &a[mid]);

compexch(&a[left], &a[right]);

compexch(&a[mid], &a[right]);

key =a[right];

while(true

)

}if (lleft >=rright)

exchange(&a[lleft], &a[rright]);

if (a[lleft]==key)

if (a[rright]==key)

}exchange(&a[lleft], &a[right]);

lleft = lleft - 1

; rright = lleft + 1

;

for (k = left; k <= p; k++, lleft--)

for (k = right - 1; k >= q; k--, rright++)

quicksort(a, left, lleft);

quicksort(a, rright, right);

}

JAVA中的排序法

一 插入法 17ggs.com 遍歷排序集合,每到乙個元素時,都要將這個元素與所有它之前的元素遍歷比較一遍,讓符合排序順序的元素挨個移動到當前範圍內它最應該出現的位置。交換是相鄰遍歷移動,雙重迴圈控制實現。這種排序法屬於地頭蛇型別,在我的地牌上我要把所有的東西按一定的順序規整,過來乙個,規整乙個。處...

java中陣列的排序,選擇排序法

要求 對陣列arr進行選擇排序法排序。思路 1,從第乙個元素 角標是0 開始,和它後面的每乙個元素進行比較,把較小的數存放在第乙個元素中,這樣,第乙個元素就是最小的值。2,從第二個元素開始,和它後面的每乙個元素進行比較,把較小的數存放在第二個元素中,這樣,第二個元素就是除第乙個外最小的值。3,繼續....

分治法中的排序問題

分治法求解排序問題的思想很簡單,只需按某種方式將序列分為兩個或多個子串行,分別進行排序,再將已經排好序的子串行合併成乙個有序序列即可。合併排序和快速排序是兩種典型的符合分治策略的排序演算法。合併排序的基本運算時把兩個或者多個有序序列合併成乙個有序序列。下面以兩路合併排序為例說明。注 以c 為例。其中...