日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常见基本排序算法

發(fā)布時間:2025/3/8 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见基本排序算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 直接插入排序
  • 希爾排序
  • 歸并排序
  • 快速排序
  • 應(yīng)用

直接插入排序

一個一個逐步插入

//直接插入排序 void InsertSort(SqList& L) {int i, j;for (i = 2; i <= L.length; i++){InsertSortCount++;if (L.r[i].key < L.r[i - 1].key) //小于時,將R[i]插入有序表{L.r[0] = L.r[i]; // R[0]作監(jiān)測哨兵L.r[i] = L.r[i - 1];for (j = i - 2; L.r[0].key < L.r[j].key; j--) {InsertSortCount++;L.r[j + 1] = L.r[j]; //記錄后移}L.r[j + 1] = L.r[0]; //插入到正確位置}} }

希爾排序

//希爾排序 void ShellInsert(SqList& L,int dk) //步長為dk的插入排序 {int i, j;for (i = dk + 1; i <= L.length; i++) {ShellSortCount++;if (L.r[i].key < L.r[i - dk].key) //小于時,需將r[i]插入有序表{L.r[0] = L.r[i]; //為統(tǒng)一算法設(shè)置監(jiān)視哨for (j = i - dk; j > 0 && L.r[0].key < L.r[j].key; j -= dk) {L.r[j + dk] = L.r[j]; //記錄后移 }L.r[j + dk] = L.r[0]; //插入到正確位置}} } void ShellSort(SqList& L,int dita[],int t) { //按增量序列dlta[0,1…,t-1]對順序表S作希爾排序for (int k = 0;k < t;k++)ShellInsert(L,dita[k]); }

歸并排序

//歸并排序算法 void Merge(RedType SR[], RedType TR[], int i, int m, int n) {int j, k;for (j = m + 1, k = i; i <= m && j <= n; k++) {MergeSortCount++;if (SR[i].key <= SR[j].key) TR[k] = SR[i++];else TR[k] = SR[j++];}while (i <= m) TR[k++] = SR[i++];while (j <= n) TR[k++] = SR[j++]; } void Msort(RedType p1[], RedType p2[], int n, int l) {int i = 1, j;while (i + 2 * l - 1 <= n){Merge(p1, p2, i, i + l - 1, i + 2 * l - 1);i = i + 2 * l;}if (i + l <= n) Merge(p1, p2, i, i + l - 1, n);else for (j = i; j <= n; j++) p2[j] = p1[j]; } void MergeSort(SqList& L) {int l = 1;RedType s[101];while (l < 100){Msort(L.r, s, L.length, l);l = l * 2;Msort(s, L.r, L.length, l);l = l * 2;} }

快速排序

//快速排序 int Partition(SqList& L, int low, int high) {L.r[0] = L.r[low]; //以子表的第一個記錄作為軸值記錄int pivotkey = L.r[low].key; //取軸值記錄關(guān)鍵字while (low < high) //從表的兩端交替地向中間掃描{QSortCount++;while (low < high && L.r[high].key >= pivotkey) high--;if (low < high) L.r[low++] = L.r[high];//將比軸值記錄小的交換到低端while (low < high && L.r[low].key <= pivotkey) low++;if (low < high) L.r[high--] = L.r[low];} //將比軸值記錄大的交換到高端L.r[low] = L.r[0]; //軸值(支點)記錄到位return low; //返回軸值(支點)記錄所在位置 } void QSort(SqList& L, int low, int high) { //對順序表L中的子序列L.r[low…h(huán)igh]作快速排序if (low < high){int pivotloc = Partition(L, low, high);QSort(L, low, pivotloc - 1); //對小于軸值序列實現(xiàn)遞歸排序QSort(L, pivotloc + 1, high);} //對大于軸值序列實現(xiàn)遞歸排序 }

應(yīng)用

例題:
隨機產(chǎn)生100 個整數(shù)構(gòu)成的序列,
分別以直接插入、希爾、快速、歸并等排序算法排序,
并統(tǒng)計各自的比較次數(shù)

/* 3、隨機產(chǎn)生100 個整數(shù)構(gòu)成的序列, 分別以直接插入、希爾、快速、歸并等排序算法排序, 并統(tǒng)計各自的比較次數(shù) */ #include <iostream> using namespace std;typedef int KeyType; typedef int InfoType;# define Maxsize 200 //待排序序列中記錄的最大個數(shù) # define T 7int InsertSortCount = 0, ShellSortCount = 0, QSortCount = 0, MergeSortCount = 0;// 待排序表中每個數(shù)據(jù)元素的數(shù)據(jù)類型定義 typedef struct {KeyType key; //表示排序關(guān)鍵字//InfoType otherinfo; //排序記錄中的其他所有數(shù)據(jù)項 } RedType; // 待排序數(shù)據(jù)表的數(shù)據(jù)類型定義 typedef struct {RedType r[Maxsize + 1]; //存放待排序全體記錄int length; //排序記錄個數(shù) } SqList;//直接插入排序 void InsertSort(SqList& L) {int i, j;for (i = 2; i <= L.length; i++){InsertSortCount++;if (L.r[i].key < L.r[i - 1].key) //小于時,將R[i]插入有序表{L.r[0] = L.r[i]; // R[0]作監(jiān)測哨兵L.r[i] = L.r[i - 1];for (j = i - 2; L.r[0].key < L.r[j].key; j--) {InsertSortCount++;L.r[j + 1] = L.r[j]; //記錄后移}L.r[j + 1] = L.r[0]; //插入到正確位置}} } //希爾排序 void ShellInsert(SqList& L,int dk) //步長為dk的插入排序 {int i, j;for (i = dk + 1; i <= L.length; i++) {ShellSortCount++;if (L.r[i].key < L.r[i - dk].key) //小于時,需將r[i]插入有序表{L.r[0] = L.r[i]; //為統(tǒng)一算法設(shè)置監(jiān)視哨for (j = i - dk; j > 0 && L.r[0].key < L.r[j].key; j -= dk) {L.r[j + dk] = L.r[j]; //記錄后移 }L.r[j + dk] = L.r[0]; //插入到正確位置}} } void ShellSort(SqList& L,int dita[],int t) { //按增量序列dlta[0,1…,t-1]對順序表S作希爾排序for (int k = 0;k < t;k++)ShellInsert(L,dita[k]); } //快速排序 int Partition(SqList& L, int low, int high) {L.r[0] = L.r[low]; //以子表的第一個記錄作為軸值記錄int pivotkey = L.r[low].key; //取軸值記錄關(guān)鍵字while (low < high) //從表的兩端交替地向中間掃描{QSortCount++;while (low < high && L.r[high].key >= pivotkey) high--;if (low < high) L.r[low++] = L.r[high];//將比軸值記錄小的交換到低端while (low < high && L.r[low].key <= pivotkey) low++;if (low < high) L.r[high--] = L.r[low];} //將比軸值記錄大的交換到高端L.r[low] = L.r[0]; //軸值(支點)記錄到位return low; //返回軸值(支點)記錄所在位置 } void QSort(SqList& L, int low, int high) { //對順序表L中的子序列L.r[low…h(huán)igh]作快速排序if (low < high){int pivotloc = Partition(L, low, high);QSort(L, low, pivotloc - 1); //對小于軸值序列實現(xiàn)遞歸排序QSort(L, pivotloc + 1, high);} //對大于軸值序列實現(xiàn)遞歸排序 } //歸并排序算法 void Merge(RedType SR[], RedType TR[], int i, int m, int n) {int j, k;for (j = m + 1, k = i; i <= m && j <= n; k++) {MergeSortCount++;if (SR[i].key <= SR[j].key) TR[k] = SR[i++];else TR[k] = SR[j++];}while (i <= m) TR[k++] = SR[i++];while (j <= n) TR[k++] = SR[j++]; } void Msort(RedType p1[], RedType p2[], int n, int l) {int i = 1, j;while (i + 2 * l - 1 <= n){Merge(p1, p2, i, i + l - 1, i + 2 * l - 1);i = i + 2 * l;}if (i + l <= n) Merge(p1, p2, i, i + l - 1, n);else for (j = i; j <= n; j++) p2[j] = p1[j]; } void MergeSort(SqList& L) {int l = 1;RedType s[101];while (l < 100){Msort(L.r, s, L.length, l);l = l * 2;Msort(s, L.r, L.length, l);l = l * 2;} } void display(SqList L) {for (int i = 1; i <= 100; i++) {cout << L.r[i].key << "\t";if (i % 10 == 0) {cout << endl;}} } int main() {//int a[800];///*//rand() % n +a;//其中的a是起始值,n-1+a是終止值,n是整數(shù)的范圍//*///for (int i = 0; i < 100; i++) {// a[i] = rand() % 200 + 1;//}SqList L;L.length = 100;for (int i = 1; i <= 100; i++) {L.r[i].key = rand() % 200 + 1;}cout << "隨機生成的100個數(shù):" << endl;display(L);int dita[T] = { 49,37,29,23,19,11,1 };int c = 1;while (c){cout << "+=====================================+" << endl;cout << "| 1.直接插入排序 |" << endl;cout << "| 2.希爾 |"<< endl;cout << "| 3.快速 |"<< endl;cout << "| 4.歸并 |" << endl;cout << "| 0.退出 |" << endl;cout << "+=====================================+" << endl;cout << "請選擇:";cin >> c;switch (c){case 1:cout << endl << "直接插入排序:" << endl;InsertSort(L);display(L);cout << "比較次數(shù):" << InsertSortCount << endl;cout << endl;break;case 2:cout << endl << "希爾:" << endl;ShellSort(L, dita, T);display(L);cout << "比較次數(shù):" << ShellSortCount << endl;cout << endl;break;case 3:cout << endl << "快速:" << endl;QSort(L, 0, 100);display(L);cout << "比較次數(shù):" << QSortCount << endl;cout << endl;break;case 4:cout << endl << "歸并:" << endl;MergeSort(L);display(L);cout << "比較次數(shù):" << MergeSortCount << endl;cout << endl;break;default:break;}}//int dita[10];//int t = 10;//for (int i = 0; i < t; i++) {// if (i == 0) {// dita[0] = 49;// }// else {// dita[i] = dita[i - 1] / 2 + 1;// if (dita[i] <= 1) {// dita[i] = 1;// }// }//}return 0; }

總結(jié)

以上是生活随笔為你收集整理的常见基本排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。