各種排序實現以及穩定性分析

2022-06-26 10:24:12 字數 3419 閱讀 7381

/**使用棧的非遞迴快速排序*

*/void quicksort2(vector &vec, int low, int

high)

if (mid + 1

//其實就是用棧儲存每乙個待排序子串的首尾元素下標,下一次while迴圈時取出這個範圍,對這段子序列進行partition操作

while (!st.empty())

if (mid + 1}}

}

void merge(vector&input, int left, int right, int mid, vector&temp)

else

}while (i <=mid)

while (j <=right)

t = 0

;

while (left <=right)

}void mergesort(vector&input, int left, int right, vector&temp)

}

/*

* (最大)堆的向下調整演算法

* * 注:陣列實現的堆中,第n個節點的左孩子的索引值是(2n+1),右孩子的索引是(2n+2)。陣列是按層編號的。

* 其中,n為陣列下標索引值,如陣列中第1個數對應的n為0。

* * 引數說明:

* a -- 待排序的陣列

* start -- 被下調節點的起始位置(一般為0,表示從第1個開始)

* end -- 截至範圍(一般為陣列中最後乙個元素的索引) */

void maxheap_down(int a, int start, int

end)

}}/*

* 堆排序(從小到大)

* * 引數說明:

* a -- 待排序的陣列

* n -- 陣列的長度 */

void heap_sort_asc(int a, intn)}

/ brief /

void makeheap_down(vector&array, int start, int

end)

}} /*

堆排序*/

void maxheap_sort(vector&a, int

n) }

void select_sort(vector&a)

}if (min_index!=i)swap(a[i], a[min_index]);}}

void bubble_sort(vector&a)}}

}

void insert_sort(vector&a)}}

void bucketsort(vector&input,int

max)

for (int i = 0,j=0; i < max; i++)}}

基數排序補充:基數排序(radix sort)是桶排序的擴充套件,它的基本思想是:將整數按位數切割成不同的數字,然後按每個位數分別比較。

具體做法是:將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列。

* 獲取陣列a中最大值

* * 引數說明:

* a -- 陣列

* n -- 陣列長度 */

int get_max(int a, int

n)/*

* 對陣列按照"某個位數"進行排序(桶排序)

* * 引數說明:

* a -- 陣列

* n -- 陣列長度

* exp -- 指數。對陣列a按照該指數進行排序。

* * 例如,對於陣列a=;

* (01) 當exp=1表示按照"個位"對陣列a進行排序

* (02) 當exp=10表示按照"十位"對陣列a進行排序

* (03) 當exp=100表示按照"百位"對陣列a進行排序

* ... */

void count_sort(int a, int n, int

exp)

;

//將資料出現的次數儲存在buckets中

for (i = 0; i < n; i++)

buckets[ (a[i]/exp)%10 ]++;

//更改buckets[i]。目的是讓更改後的buckets[i]的值,是該資料在output中的位置。

for (i = 1; i < 10; i++)

buckets[i] += buckets[i - 1

];

//將資料儲存到臨時陣列output中

for (i = n - 1; i >= 0; i--)

//將排序好的資料賦值給a

for (i = 0; i < n; i++)

a[i] =output[i];}/*

* 基數排序

* * 引數說明:

* a -- 陣列

* n -- 陣列長度 */

void radix_sort(int a, int

n)

排序演算法穩定性分析

首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。在簡單形式化一下,如果ai aj,ai原來在位置前,排序後ai還是要在aj位置前。其次,說一下穩定性的好處。排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個...

常用排序穩定性分析

選擇排序 快速排序 希爾排序 堆排序不是穩定的排序演算法 氣泡排序 插入排序 歸併排序和基數排序都是穩定的排序演算法。研究排序演算法的穩定性有何意義?首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資料其在序列中的先後位置順序與排序後它們兩個先後位置順序相同。再簡單具體一點...

排序演算法穩定性分析

氣泡排序 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的 如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,...