第十六周 專案3 歸併排序演算法的改進

2021-07-08 21:42:30 字數 3582 閱讀 1583

* 檔名稱:main.cpp,btree.h,btree.cpp

* 完成日期:2023年12月14日

* 版本號:code ::block 12.11

* 問題描述:

採用歸併排序、快速排序等高效演算法進行排序,當資料元素較少時(如

n≤64)

,經常直接使用直接插入排序演算法等高複雜度的演算法。這樣做,會帶來一定的好處,例如歸併排序減少分配、**臨時儲存區域的頻次,快速排序減少遞迴層次等。

試按上面的思路,重新實現歸併排序演算法。

基數排序

*/測試**:

#include "sort.h"

#include

//1. 對r[0..n-1]按遞增有序進行直接插入排序

void insertsort(rectype r,int n)

//5. 直接選擇排序

void selectsort(rectype r,int n)

}//7.歸併排序輔助1——合併有序表

void merge(rectype r,int low,int mid,int high)

else                            //將第2段中的記錄放入r1中

while (i<=mid)                      //將第1段餘下部分複製到r1

while (j<=high)                 //將第2段餘下部分複製到r1

for (k=0,i=low; i<=high; k++,i++) //將r1複製回r中

r[i]=r1[k];

}//7. 歸併排序輔助2——一趟歸併

void mergepass(rectype r,int length,int n)    //對整個數序進行一趟歸併

else

}t->next=null;

}//8. 基數排序的輔助函式,釋放基數排序用的鍊錶

void destorylink(radixrectype *&p)

return;

}//8. 實現基數排序:*p為待排序序列鍊錶指標,基數r和關鍵字位數d已經作為符號常量定義好

void radixsort(radixrectype *&p)

else

p=p->next;                  //取下乙個待排序的元素

}p=null;                         //重新用p來收集所有結點

for (j=0; jnext=head[j];

t=tail[j];}}

t->next=null;                   //最後乙個結點的next域置null

//下面更新用於分離出第i位數字的d2

d2*=10;}}

標頭檔案:

#ifndef sort_h_included

#define sort_h_included

#define maxsize 50000 //最多的資料,取5萬,只測試快速演算法,可以往大調整

//下面的符號常量和結構體針對基數排序

#define radix 10 //基數的取值

#define digits 10 //關鍵字位數

typedef int keytype; //定義關鍵字型別

typedef char infotype[10];

typedef struct //記錄型別

rectype; //排序的記錄型別定義

typedef struct node

radixrectype;

void insertsort(rectype r,int n); //直接插入排序

void shellsort(rectype r,int n); //希爾排序演算法

void bubblesort(rectype r,int n); //氣泡排序

void quicksort(rectype r,int n); //快速排序

void selectsort(rectype r,int n); //直接選擇排序

void heapsort(rectype r,int n); //堆排序

void mergesort(rectype r,int n); //歸併排序

//下面函式支援基數排序

void createlink(radixrectype *&p,rectype r,int n); //建立基數排序用的鍊錶

void destorylink(radixrectype *&p); //釋放基數排序用的鍊錶

void radixsort(radixrectype *&p); //基數排序

#endif // sort_h_included

原始檔:

#include "sort.h"

#include //1. 對r[0..n-1]按遞增有序進行直接插入排序

void insertsort(rectype r,int n)

}//7.歸併排序輔助1——合併有序表

void merge(rectype r,int low,int mid,int high)

else //將第2段中的記錄放入r1中

while (i<=mid) //將第1段餘下部分複製到r1

while (j<=high) //將第2段餘下部分複製到r1

for (k=0,i=low; i<=high; k++,i++) //將r1複製回r中

r[i]=r1[k];

}//7. 歸併排序輔助2——一趟歸併

void mergepass(rectype r,int length,int n) //對整個數序進行一趟歸併

else

}t->next=null;

}//8. 基數排序的輔助函式,釋放基數排序用的鍊錶

void destorylink(radixrectype *&p)

return;

}//8. 實現基數排序:*p為待排序序列鍊錶指標,基數r和關鍵字位數d已經作為符號常量定義好

void radixsort(radixrectype *&p)

else

p=p->next; //取下乙個待排序的元素

}p=null; //重新用p來收集所有結點

for (j=0; jnext=head[j];

t=tail[j];}}

t->next=null; //最後乙個結點的next域置null

//下面更新用於分離出第i位數字的d2

d2*=10;}}

結果:

第十六周專案3 歸併排序演算法的排序

問題及 檔名稱 專案3.cpp 作 者 李曉鈺 完成日期 2016年12月17日 版 本 號 v1.0 問題描述 歸併排序演算法的改進 採用歸併排序 快速排序等高效演算法進行排序,當資料元素較少時 如n 64 經常直接使用直接插入排序演算法等高複雜度 的演算法。這樣做,會帶來一定的好處,例如歸併排序...

第十六周專案3 歸併排序演算法改進

問題及 煙台大學計算機與控制工程學院 作 者 劉倩 完成日期 2016年12月9日 問題描述 採用歸併排序 快速排序等高效演算法進行排序,當資料元素較少時 如n 64 經常直接使用直接插入排序演算法等高複雜度的演算法。這樣做,會帶來一定的好處,例如歸併排序減少分配 臨時儲存區域的頻次,快速排序減少遞...

第十六周專案3 歸併排序演算法的改進

檔名稱 專案3.cpp 作 者 高金豔 完成日期 2016年12月14日 版 本 號 v1.0 問題描述 採用歸併排序 快速排序等高效演算法進行排序,當資料元素較少時 如n 64 經常直接使用直接插入排序演算法等高複雜度的演算法。這樣做,會帶來一定的好處,例如歸併排序減少分配 臨時儲存區域的頻次,快...