最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)九大排序算法的實例代碼

 更新時間:2021年01月15日 12:00:23   作者:畏新  
這篇文章主要給大家介紹了關(guān)于C語言實現(xiàn)九大排序算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

直接插入排序

將數(shù)組分為兩個部分,一個是有序部分,一個是無序部分。從無序部分中依次取出元素插入到有序部分中。過程就是遍歷有序部分,實現(xiàn)起來比較簡單。

#include <stdio.h>

void insertion_sort(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  int data = arr[i];
  int j = 0;
  while (arr[j] < arr[i]) {
   j++;
  }
  for (int k = i; k >= j + 1; k--) {
   arr[k] = arr[k - 1];
  }
  arr[j] = data;
 }
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int arr[7] = {8, 2, 6, 0, 5, 7, 4};
 insertion_sort(arr, 7);
 print_array(arr, 7);
 return 0;
}

折半插入排序

折半插入再直接插入上有改進,用折半搜索替換遍歷數(shù)組,在數(shù)組長度大時能夠提升查找性能。其本質(zhì)還是從無序部分取出元素插入到有序部分中。

#include <stdio.h>

void binary_insertion_sort(int arr[], int array_length) {
 int i, j, low = 0, high = 0, mid;
 int temp = 0;
 for (i = 1; i < array_length; i++) {
  low = 0;
  high = i - 1;
  temp = arr[i];
  while (low <= high) {
   mid = (low + high) / 2;
   if (arr[mid] > temp) {
    high = mid - 1;
   } else {
    low = mid + 1;
   }
  }
  for (j = i; j > low; j--) {
   arr[j] = arr[j - 1];
  }
  arr[low] = temp;
 }
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int brr[5] = {2, 6, 0, 5, 7};
 binary_insertion_sort(brr, 5);
 print_array(brr, 5);
 return 0;
}

希爾排序

希爾排序的核心就是根據(jù)步長分組,組內(nèi)進行插入排序。關(guān)于步長的選取,第一次步長取元素的個數(shù),后面每次取原來步長的一半。

希爾排序?qū)儆诓迦肱判虻囊环N。

#include <stdio.h>

void shell_sort(int arr[], int array_length) {
 int step = array_length / 2;
 while (step >= 1) {
  for (int i = 0; i < array_length; i += step) {
   int data = arr[i];
   int j = 0;
   while (arr[j] < arr[i]) {
    j++;
   }
   for (int k = i; k >= j + 1; k--) {
    arr[k] = arr[k - 1];
   }
   arr[j] = data;
  }
  step = step / 2;
 }
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int crr[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
 shell_sort(crr, 10);
 print_array(crr, 10);
 return 0;
}

冒泡排序

冒泡的特點是兩兩交換。通過交換把最大的元素交換到后面去了,每次循環(huán)遍歷都把無序部分最大的“沉”到后面去。小數(shù)上“浮”和大數(shù)下“沉”其實沒有差別,都能實現(xiàn)冒泡。

#include <stdio.h>

void bubble_sort(int arr[], int array_length) {
 for (int i = 0; i < array_length - 1; ++i) {
  for (int j = 0; j < array_length - i - 1; ++j) {
   if (arr[j] > arr[j + 1]) {
    int temp = arr[j];
    arr[j] = arr[j + 1];
    arr[j + 1] = temp;
   }
  }
 }
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int drr[7] = {8, 2, 6, 0, 5, 7, 4};
 bubble_sort(drr, 7);
 print_array(drr, 7);
 return 0;
}

快速排序

快排的精髓在于選定一個標準(通常選數(shù)組的第一個元素),然后將所有元素根據(jù)標準分為小于和大于兩個部分,然后這兩個部分再選取標準,繼續(xù)遞歸下去,不難想象最終排序結(jié)果是整體有序的。

#include <stdio.h>

int getStandard(int arr[], int low, int high) {
 int flag = arr[low];
 while (low < high) {
  while (low < high && arr[high] >= flag) {
   high--;
  }
  if (low < high) {
   arr[low] = arr[high];
  }
  while (low < high && arr[low] <= flag) {
   low++;
  }
  if (low < high) {
   arr[high] = arr[low];
  }
 }
 arr[low] = flag;
 return low;
}

void quick_sort(int arr[], int low, int high) {
 if (low < high) {
  int pos = getStandard(arr, low, high);
  quick_sort(arr, low, pos - 1);
  quick_sort(arr, pos + 1, high);
 }
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int err[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
 quick_sort(err, 0, 9);
 print_array(err, 10);
 return 0;
}

直接選擇排序

如其名,直接選擇一個最小的放到最前面,但是遍歷往往導(dǎo)致效率較低。

#include <stdio.h>

void select_sort(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  int min_pos = i;
  for (int j = i; j < array_length; ++j) {
   if (arr[min_pos] > arr[j])
    min_pos = j;
  }
  int temp = arr[min_pos];
  arr[min_pos] = arr[i];
  arr[i] = temp;
 }
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int frr[7] = {8, 2, 6, 0, 5, 7, 4};
 select_sort(frr, 7);
 print_array(frr, 7);
 return 0;
}

堆排序

將數(shù)組轉(zhuǎn)換為一顆完全二叉樹。任意一個父節(jié)點大于它的子節(jié)點,這樣的完全二叉樹叫做大頂堆;與之相反的,任意一個父節(jié)點小于它的子節(jié)點,這樣的完全二叉樹叫做小頂堆。

堆排序的精華就在于把元素個數(shù)為n的完全二叉樹轉(zhuǎn)換為大頂堆,然后把堆頂和最后一個元素交換,此時產(chǎn)生了一個元素個數(shù)為n-1的完全二叉樹,然后再轉(zhuǎn)換為大頂堆,繼續(xù)把堆頂和最后一個元素交換。循環(huán)往復(fù)就實現(xiàn)了排序。其實質(zhì)還是選擇排序,每次選出一個最大的,和最后一個交換,不過完全二叉樹中選最大元素比遍歷數(shù)組會快很多。

#include <stdio.h>

void heap_adjust(int arr[], int n) {
 for (int i = n / 2; i >= 1; i--) {
  if (arr[i - 1] < arr[2 * i - 1]) {
   int temp = arr[i - 1];
   arr[i - 1] = arr[2 * i - 1];
   arr[2 * i - 1] = temp;
  }
  if (arr[i - 1] < arr[2 * i] && (2 * i) < n) {
   int temp = arr[i - 1];
   arr[i - 1] = arr[2 * i];
   arr[2 * i] = temp;
  }
 }
}

void heap_sort(int arr[], int array_length) {
 int n = array_length;
 do {
  heap_adjust(arr, n);
  int temp = arr[0];
  arr[0] = arr[n - 1];
  arr[n - 1] = temp;
 } while (n--);
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int grr[7] = {8, 2, 6, 0, 5, 7, 4};
 heap_sort(grr, 7);
 print_array(grr, 7);
 return 0;
}

歸并排序

歸并的思想在于對復(fù)雜問題的分治,打散到最小長度后然后再進行合并操作。假設(shè)有兩個數(shù)組A、B,指針i指向A的頭部,指針j指向B的頭部,兩邊同時進行遍歷,找到一個小的就放到數(shù)組里面,對應(yīng)指針后移一位,這樣就能夠保證合并后的數(shù)組是有序的。

#include <stdio.h>
#include <malloc.h>

void merge(int arr[], int start, int mid, int end) {
 int *new_array = (int *) malloc(sizeof(int) * (end - start + 1));
 int i = start;
 int j = mid + 1;
 int k = 0;
 while (i <= mid && j <= end) {
  if (arr[i] < arr[j]) {
   new_array[k++] = arr[i++];
  } else {
   new_array[k++] = arr[j++];
  }
 }
 while (i <= mid) {
  new_array[k++] = arr[i++];
 }
 while (j <= end) {
  new_array[k++] = arr[j++];
 }
 for (int l = 0; l < k; ++l) {
  arr[start + l] = new_array[l];
 }
 free(new_array);
}

void merge_sort(int arr[], int start, int end) {
 int mid = (start + end) / 2;
 if (start >= end) {
  return;
 }
 merge_sort(arr, start, mid);
 merge_sort(arr, mid + 1, end);
 merge(arr, start, mid, end);
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int hrr[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
 merge_sort(hrr, 0, 9);
 print_array(hrr, 10);
 return 0;
}

基數(shù)排序

先按照個位排序?qū)⑺袛?shù)字分配到0-9這10個桶里面,然后再按照桶的順序收集起來;再按照十位排序,同樣的步驟……

基礎(chǔ)排序的本質(zhì)是對每一位進行排序,對每一位進行排序后就能保證這一個數(shù)整體的大小是按照順序排列的。

#include <stdio.h>
#include <malloc.h>

int get_num(int number, int pos) {
 int num = 0;
 while (pos--) {
  num = number % 10;
  number = number / 10;
 }
 return num;
}

void radix_sort(int arr[], int array_length) {
 int *bucket[10];
 for (int i = 0; i < 10; ++i) {
  bucket[i] = (int *) malloc(sizeof(int) * array_length + 1);
  bucket[i][0] = 0;//桶的第一位保存桶中元素個數(shù)
 }
 for (int b = 1; b <= 31; ++b) {
  for (int i = 0; i < array_length; ++i) {
   int num = get_num(arr[i], b);//計算每個位上的數(shù)字(個位、十位、百位...)
   int index = ++bucket[num][0];//計算下標
   bucket[num][index] = arr[i];//保存到桶中
  }
  for (int i = 0, k = 0; i < 10; i++) {
   for (int j = 1; j <= bucket[i][0]; ++j) {
    arr[k++] = bucket[i][j];//從桶里面按順序取出來
   }
   bucket[i][0] = 0;//下標清零
  }
 }
}

void print_array(int arr[], int array_length) {
 for (int i = 0; i < array_length; ++i) {
  printf("%d ", arr[i]);
 }
 printf("\n");
}

int main() {
 int irr[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
 radix_sort(irr, 10);
 print_array(irr, 10);
 return 0;
}

總結(jié)

到此這篇關(guān)于C語言實現(xiàn)九大排序算法的文章就介紹到這了,更多相關(guān)C語言九大排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++中priority_queue模擬的實現(xiàn)

    c++中priority_queue模擬的實現(xiàn)

    priority_queue是C++標準庫中的一個容器適配器,用于實現(xiàn)優(yōu)先隊列的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了c++中priority_queue模擬的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-09-09
  • C++面向?qū)ο笾鄳B(tài)的實現(xiàn)和應(yīng)用詳解

    C++面向?qū)ο笾鄳B(tài)的實現(xiàn)和應(yīng)用詳解

    相信大家都知道面向?qū)ο蟮娜筇匦允欠庋b,繼承和多態(tài),下面這篇文章主要給大家介紹了關(guān)于C++面向?qū)ο笾鄳B(tài)的實現(xiàn)和應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • C++多線程強制終止詳細

    C++多線程強制終止詳細

    這篇文章主要介紹了C++多線程強制終止, 實際上,沒有任何語言或操作系統(tǒng)可以為你提供異步突然終止線程的便利,且不會警告你不要使用它們。但是下面我們再來簡單看看相關(guān)內(nèi)容吧
    2021-09-09
  • C語言實現(xiàn)打飛機游戲

    C語言實現(xiàn)打飛機游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)打飛機游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++中進行txt文件讀入和寫入的方法示例

    C++中進行txt文件讀入和寫入的方法示例

    這篇文章主要給大家介紹了C++中進行txt文件讀入和寫入的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 詳解C語言中結(jié)構(gòu)體的自引用和相互引用

    詳解C語言中結(jié)構(gòu)體的自引用和相互引用

    這篇文章主要介紹了C語言中結(jié)構(gòu)體的自引用和相互引用,詳細解析了結(jié)構(gòu)體中指針的指向情況,需要的朋友可以參考下
    2016-04-04
  • C++編寫DLL動態(tài)鏈接庫的步驟與實現(xiàn)方法

    C++編寫DLL動態(tài)鏈接庫的步驟與實現(xiàn)方法

    這篇文章主要介紹了C++編寫DLL動態(tài)鏈接庫的步驟與實現(xiàn)方法,結(jié)合實例形式分析了C++導(dǎo)出類文件及生成與調(diào)用DLL動態(tài)連接庫的相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08
  • C++超詳細分析單鏈表的實現(xiàn)與常見接口

    C++超詳細分析單鏈表的實現(xiàn)與常見接口

    鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的,本章帶你分析單鏈表的實現(xiàn)與常見接口
    2022-03-03
  • C++中的Qt?QTableView詳解

    C++中的Qt?QTableView詳解

    這篇文章主要介紹了Qt?QTableView詳解,主要包括常用接口,設(shè)置item屬性,右鍵彈出菜單,結(jié)合示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • QT定時器事件的實現(xiàn)示例

    QT定時器事件的實現(xiàn)示例

    本文介紹了QT定時器事件的概念和原理,闡述了其工作方式及實現(xiàn)方法,QT定時器事件可以用于在一定時間間隔內(nèi)執(zhí)行特定的任務(wù),從而實現(xiàn)定時操作和控制,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08

最新評論

田东县| 丽江市| 湘潭市| 广灵县| 乌兰浩特市| 繁峙县| 平乡县| 宝山区| 固阳县| 阳泉市| 时尚| 财经| 昌平区| 梁河县| 西畴县| 焦作市| 明水县| 呼图壁县| 科尔| 高阳县| 镇雄县| 沅江市| 星子县| 神池县| 谢通门县| 衡东县| 大兴区| 日喀则市| 东阳市| 班戈县| 黑河市| 西林县| 涿州市| 夏邑县| 乌恰县| 德清县| 铜梁县| 济阳县| 迭部县| 福建省| 石泉县|