歸併排序,選擇排序,和它們的組合

2022-09-10 07:18:10 字數 2582 閱讀 7578

1

void selection(int *a, int left, int right)//

輸入陣列a,要排序的左端點left和右端點right215

16}17}

18 }

2.1.1 什麼是歸併排序

用下面一張圖能清晰的描述歸併排序

2.2.1 遞迴部分

void mergesort(int *a, int left, int right) //

輸入陣列a,要排序的左端點left和右端點right

}

2.2.2 排序部分

void merge(int *a, int left, int mid, int right)//

輸入陣列a,要排序的左端點left和右端點right,中點mid

for (int i = 0; i < nr; i++)//

將陣列a右端的元素賦給右端陣列

al[nl] = inf;//

設定左端陣列的最後乙個元素為哨兵

ar[nr] = inf;//

設定右端陣列的最後乙個元素為哨兵

//將左端陣列和右端陣列的元素排序填入陣列a

int i = 0

;

int j = 0

;

for (int k = left; k < right + 1; k++)//

遍歷陣列a左端點left到右端點right+1,用於填入元素

else

//若左端陣列的元素大於右端陣列的元素,將右端陣列的第j個元素填入陣列a

/*若任意一端陣列元素到最後乙個,

該陣列的最後乙個元素哨兵將恆大於另一陣列最後乙個之前的元素

使另一陣列的元素陸續填入陣列a

*/}}

//

我們用 mergetoselectionnum 來確定何時將歸併排序轉到選擇排序

void mergeselectionsort(int *a, int left, int right, int

mergetoselectionnum)

else

//否則,進行選擇排序}}

#include #define max 10000  //

陣列元素最大值

#define inf 2147483647 //

哨兵,不超過int範圍

void sort(int*, int, int);//

排序初始化

void mergeselectionsort(int*, int, int, int);//

歸併排序與選擇排序的組合

void merge(int*, int, int, int);//

歸併排序

void selection(int*, int, int);//

選擇排序

void pri(int*,int);//

輸出陣列

intmain()

void pri(int *a, int len)//

輸出

}void selection(int *a, int left, int right)//

輸入陣列a,要排序的左端點left和右端點right}}

}void merge(int *a, int left, int mid, int right)//

輸入陣列a,要排序的左端點left和右端點right,中點mid

for (int i = 0; i < nr; i++)//

將陣列a右端的元素賦給右端陣列

al[nl] = inf;//

設定左端陣列的最後乙個元素為哨兵

ar[nr] = inf;//

設定右端陣列的最後乙個元素為哨兵

//將左端陣列和右端陣列的元素排序填入陣列a

int i = 0

;

int j = 0

;

for (int k = left; k < right + 1; k++)//

遍歷陣列a左端點left到右端點right+1,用於填入元素

else

//若左端陣列的元素大於右端陣列的元素,將右端陣列的第j個元素填入陣列a

/*若任意一端陣列元素到最後乙個,

該陣列的最後乙個元素哨兵將恆大於另一陣列最後乙個之前的元素

使另一陣列的元素陸續填入陣列a

*/}}//

我們用 mergetoselectionnum 來確定何時將歸併排序轉到選擇排序

void mergeselectionsort(int *a, int left, int right, int

mergetoselectionnum)

else

//否則,進行選擇排序

}}void sort(int *a, int len,int

mergetoselectionnum)

參考文獻 演算法導論_原書第3版

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...

排序 歸併排序

利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...