亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現八個常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序等

2020-01-26 15:00:30
字體:
來源:轉載
供稿:網友

本文實現了八個常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序 、快速排序、歸并排序、堆排序和LST基數排序

首先是算法實現文件Sort.h,代碼如下:

/* * 實現了八個常用的排序算法:插入排序、冒泡排序、選擇排序、希爾排序 * 以及快速排序、歸并排序、堆排序和LST基數排序 * @author gkh178 */ #include <iostream>  template<class T> void swap_value(T &a, T &b) {   T temp = a;   a = b;   b = temp; }  //插入排序:時間復雜度o(n^2) template<class T> void insert_sort(T a[], int n) {   for (int i = 1; i < n; ++i)   {     T temp = a[i];     int j = i - 1;     while (j >= 0 && a[j] > temp)     {       a[j + 1] = a[j];       --j;     }     a[j + 1] = temp;   } }  //冒泡排序:時間復雜度o(n^2)  template<class T> void bubble_sort(T a[], int n) {   for (int i = n - 1; i > 0; --i)   {     for (int j = 0; j < i; ++j)     {       if (a[j] > a[j + 1])       {         swap_value(a[j], a[j + 1]);       }     }   } }  //選擇排序:時間復雜度o(n^2) template<class T> void select_sort(T a[], int n) {   for (int i = 0; i < n - 1; ++i)   {     T min = a[i];     int index = i;     for (int j = i + 1; j < n; ++j)     {       if (a[j] < min)       {         min = a[j];         index = j;       }     }     a[index] = a[i];     a[i] = min;   } }  //希爾排序:時間復雜度介于o(n^2)和o(nlgn)之間  template<class T> void shell_sort(T a[], int n) {   for (int gap = n / 2; gap >= 1; gap /= 2)   {     for (int i = gap; i < n; ++i)     {       T temp = a[i];       int j = i - gap;       while (j >= 0 && a[j] > temp)       {         a[j + gap] = a[j];         j -= gap;       }       a[j + gap] = temp;     }   } }  //快速排序:時間復雜度o(nlgn)  template<class T> void quick_sort(T a[], int n) {   _quick_sort(a, 0, n - 1); } template<class T> void _quick_sort(T a[], int left, int right) {   if (left < right)   {     int q = _partition(a, left, right);     _quick_sort(a, left, q - 1);     _quick_sort(a, q + 1, right);   } } template<class T> int _partition(T a[], int left, int right) {   T pivot = a[left];   while (left < right)   {     while (left < right && a[right] >= pivot)     {       --right;     }     a[left] = a[right];     while (left < right && a[left] <= pivot)     {       ++left;     }     a[right] = a[left];   }   a[left] = pivot;   return left; }  //歸并排序:時間復雜度o(nlgn)  template<class T> void merge_sort(T a[], int n) {   _merge_sort(a, 0, n - 1); } template<class T> void _merge_sort(T a[], int left, int right) {   if (left < right)   {     int mid = left + (right - left) / 2;     _merge_sort(a, left, mid);     _merge_sort(a, mid + 1, right);     _merge(a, left, mid, right);   } } template<class T> void _merge(T a[], int left, int mid, int right) {   int length = right - left + 1;   T *newA = new T[length];   for (int i = 0, j = left; i <= length - 1; ++i, ++j)   {     *(newA + i) = a[j];   }   int i = 0;   int j = mid - left + 1;   int k = left;   for (; i <= mid - left && j <= length - 1; ++k)   {     if (*(newA + i) < *(newA + j))     {       a[k] = *(newA + i);       ++i;     }     else     {       a[k] = *(newA + j);       ++j;     }   }   while (i <= mid - left)   {     a[k++] = *(newA + i);     ++i;   }   while (j <= right - left)   {     a[k++] = *(newA + j);     ++j;   }   delete newA; }  //堆排序:時間復雜度o(nlgn)  template<class T> void heap_sort(T a[], int n) {   built_max_heap(a, n);//建立初始大根堆    //交換首尾元素,并對交換后排除尾元素的數組進行一次上調整    for (int i = n - 1; i >= 1; --i)   {     swap_value(a[0], a[i]);     up_adjust(a, i);   } } //建立一個長度為n的大根堆  template<class T> void built_max_heap(T a[], int n) {   up_adjust(a, n); } //對長度為n的數組進行一次上調整  template<class T> void up_adjust(T a[], int n) {   //對每個帶有子女節點的元素遍歷處理,從后到根節點位置    for (int i = n / 2; i >= 1; --i)   {     adjust_node(a, n, i);   } } //調整序號為i的節點的值  template<class T> void adjust_node(T a[], int n, int i) {   //節點有左右孩子    if (2 * i + 1 <= n)   {     //右孩子的值大于節點的值,交換它們      if (a[2 * i] > a[i - 1])     {       swap_value(a[2 * i], a[i - 1]);     }     //左孩子的值大于節點的值,交換它們      if (a[2 * i - 1] > a[i - 1])     {       swap_value(a[2 * i - 1], a[i - 1]);     }     //對節點的左右孩子的根節點進行調整      adjust_node(a, n, 2 * i);     adjust_node(a, n, 2 * i + 1);   }   //節點只有左孩子,為最后一個有左右孩子的節點    else if (2 * i == n)   {     //左孩子的值大于節點的值,交換它們      if (a[2 * i - 1] > a[i - 1])     {       swap_value(a[2 * i - 1], a[i - 1]);     }   } }  //基數排序的時間復雜度為o(distance(n+radix)),distance為位數,n為數組個數,radix為基數  //本方法是用LST方法進行基數排序,MST方法不包含在內  //其中參數radix為基數,一般為10;distance表示待排序的數組的數字最長的位數;n為數組的長度  template<class T> void lst_radix_sort(T a[], int n, int radix, int distance) {   T* newA = new T[n];//用于暫存數組    int* count = new int[radix];//用于計數排序,保存的是當前位的值為0 到 radix-1的元素出現的的個數    int divide = 1;   //從倒數第一位處理到第一位    for (int i = 0; i < distance; ++i)   {     //待排數組拷貝到newA數組中     for (int j = 0; j < n; ++j)     {       *(newA + j) = a[j];     }     //將計數數組置0      for (int j = 0; j < radix; ++j)     {       *(count + j) = 0;     }     for (int j = 0; j < n; ++j)     {       int radixKey = (*(newA + j) / divide) % radix; //得到數組元素的當前處理位的值        (*(count + radixKey))++;     }     //此時count[]中每個元素保存的是radixKey位出現的次數      //計算每個radixKey在數組中的結束位置,位置序號范圍為1-n      for (int j = 1; j < radix; ++j)     {       *(count + j) = *(count + j) + *(count + j - 1);     }     //運用計數排序的原理實現一次排序,排序后的數組輸出到a[]      for (int j = n - 1; j >= 0; --j)     {       int radixKey = (*(newA + j) / divide) % radix;       a[*(count + radixKey) - 1] = newA[j];       --(*(count + radixKey));     }     divide = divide * radix;   } } 

然后是測試文件main.cpp,代碼如下:

#include "Sort.h" using namespace std;  template<class T> void printArray(T a[], int n) {   for (int i = 0; i < n; ++i)   {     cout << a[i] << " ";   }   cout << endl; }  int main() {   for (int i = 1; i <= 8; ++i)   {     int arr[] = { 45, 38, 26, 77, 128, 38, 25, 444, 61, 153, 9999, 1012, 43, 128 };     switch (i)     {     case 1:       insert_sort(arr, sizeof(arr) / sizeof(arr[0]));       break;     case 2:       bubble_sort(arr, sizeof(arr) / sizeof(arr[0]));       break;     case 3:       select_sort(arr, sizeof(arr) / sizeof(arr[0]));       break;     case 4:       shell_sort(arr, sizeof(arr) / sizeof(arr[0]));       break;     case 5:       quick_sort(arr, sizeof(arr) / sizeof(arr[0]));       break;     case 6:       merge_sort(arr, sizeof(arr) / sizeof(arr[0]));       break;     case 7:       heap_sort(arr, sizeof(arr) / sizeof(arr[0]));       break;     case 8:       lst_radix_sort(arr, sizeof(arr) / sizeof(arr[0]), 10, 4);       break;     default:       break;     }     printArray(arr, sizeof(arr) / sizeof(arr[0]));   }   return 0; } 

最后是運行結果圖,如下:

以上就是C++實現八個常用的排序算法的全部代碼,希望大家對C++排序算法有更進一步的了解。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本久久久a级免费| 78m国产成人精品视频| 亚洲欧美色图片| 亚洲精品小视频| 992tv成人免费影院| 久久夜色精品亚洲噜噜国产mv| 日韩电影在线观看永久视频免费网站| 久久久久久久国产精品视频| 精品国产一区av| 日韩精品高清在线| 尤物99国产成人精品视频| 欧美日韩成人精品| 国产精品视频在线播放| 欧美电影免费在线观看| 久久久久久久久久久久久久久久久久av| 96sao精品视频在线观看| 成人免费直播live| 国产精品日韩在线| 26uuu久久噜噜噜噜| 日韩欧美aⅴ综合网站发布| 91精品国产综合久久久久久久久| 国产婷婷97碰碰久久人人蜜臀| 精品国产91久久久久久老师| 欧美成人久久久| 国产精品永久在线| 国产精品久久久久久久久| 国产欧美最新羞羞视频在线观看| 欧美在线国产精品| 欧美黄网免费在线观看| 亚洲精品中文字幕女同| 欧美亚洲激情视频| 欧美影院成年免费版| 欧美成在线观看| 欧美最顶级丰满的aⅴ艳星| 2019中文字幕免费视频| 一道本无吗dⅴd在线播放一区| 亚洲精品日韩欧美| 中文日韩电影网站| 日韩精品在线第一页| 国产精品a久久久久久| 亚洲区免费影片| 亚洲最大福利网站| 日本精品一区二区三区在线播放视频| 欧美日韩午夜激情| 日本免费久久高清视频| 国产亚洲美女精品久久久| 欧美中文字幕视频| 97色在线观看免费视频| 最新国产成人av网站网址麻豆| 欧美性videos高清精品| 91亚洲午夜在线| 国产欧美va欧美va香蕉在| 91久久精品视频| 久久久视频免费观看| 中文字幕一区二区三区电影| 国产精品久久久久久久久粉嫩av| 精品亚洲一区二区| 欧美国产亚洲视频| 成人激情视频在线观看| 97av在线播放| 欧美日韩美女在线观看| 尤物yw午夜国产精品视频明星| 亚洲日韩欧美视频一区| 成人激情电影一区二区| 亚洲a级在线观看| 91成人天堂久久成人| 久久久久久一区二区三区| 日韩av综合网| 92版电视剧仙鹤神针在线观看| 狠狠综合久久av一区二区小说| 亚洲精品动漫久久久久| 日韩高清电影免费观看完整| 成人av资源在线播放| 久久久精品视频成人| 98精品国产自产在线观看| 日本欧美爱爱爱| 日韩精品视频免费专区在线播放| 91久久精品一区| 成人欧美一区二区三区在线| 亚洲免费视频在线观看| 92福利视频午夜1000合集在线观看| 精品久久久久久亚洲精品| 伊人久久五月天| 国产日韩欧美视频| 亚洲丝袜在线视频| 亚洲精品99999| 91网站在线看| 96pao国产成视频永久免费| 国产91成人video| 91啪国产在线| 亚洲精品自拍第一页| 久久久免费观看视频| 欧美激情xxxxx| 欧美在线视频a| 国产免费一区视频观看免费| 亚洲男人的天堂网站| 国产精品老女人视频| 欧美福利在线观看| 久久久中精品2020中文| 亚洲www视频| 日韩精品在线免费播放| 青青精品视频播放| 青青草原一区二区| 国产一区二区三区毛片| 日韩欧美中文字幕在线观看| 富二代精品短视频| 精品福利在线视频| 日韩欧美在线看| 国产精品av免费在线观看| 国产97在线播放| 欧美二区在线播放| 九九热这里只有在线精品视| 久久精品一区中文字幕| 一区二区三区美女xx视频| 日本一区二区不卡| 97视频色精品| 97超级碰碰碰久久久| 国产精品一香蕉国产线看观看| 国产一区二区三区高清在线观看| 亚洲一区国产精品| 日韩亚洲欧美中文在线| 亚洲电影av在线| 日本高清不卡在线| 91探花福利精品国产自产在线| 国产精品爽爽爽| 日韩在线观看免费全集电视剧网站| 亚洲精品中文字幕av| 91在线观看免费网站| 国产99久久精品一区二区 夜夜躁日日躁| 日韩在线免费高清视频| 国产精品永久免费在线| 日本道色综合久久影院| xxav国产精品美女主播| 亚洲性av网站| 色阁综合伊人av| 久久久999国产精品| 国产欧美精品久久久| 国产在线观看不卡| 国产精品自产拍高潮在线观看| 91精品视频在线免费观看| 日韩av快播网址| 日韩一区二区福利| 成人黄色午夜影院| 日韩欧美aⅴ综合网站发布| 欧美黄色片在线观看| 久久久久国产精品免费网站| 亚洲成色777777在线观看影院| 亚洲综合在线播放| 精品色蜜蜜精品视频在线观看| 国产精品日韩在线播放| 欧美俄罗斯性视频| 日韩高清电影免费观看完整| 黄色成人av在线| 中文字幕最新精品| 亚洲色图18p| 亚洲精品国产精品国自产观看浪潮| 亚洲人成网站999久久久综合| 热久久美女精品天天吊色| 日韩精品视频三区| 久久久久久18| 欧美在线视频免费观看| 亚洲欧洲美洲在线综合| 欧美成人精品一区二区| 一本一本久久a久久精品综合小说|