C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)
參考:C語言五大排序(桶排序,冒泡排序,選擇排序,插入排序,快速排序)動態演示
作者:一只青木呀
發布時間: 2020-09-09 20:18:43
網址:https://blog.csdn.net/weixin_45309916/article/details/108483621
目錄
- 什么是排序?
- 1、桶排序
- 概念
- 思路
- demo
- 運行效果
- 2、冒泡排序
- 動圖演示
- 概念
- 思路
- demo
- 運行效果
- 3、選擇排序
- 動圖演示
- 概念
- 思路
- demo
- 運行結果
- 4、插入排序
- 動圖演示
- 概念
- 思路
- demo
- 運行效果
- 5、快速排序
- 動圖演示
- 概念
- 思路
- demo
- 運行結果
什么是排序?
排序: 把無序變成有序
1、桶排序
概念
桶排序 (Bucket sort)或所謂的箱排序,是一個排序算法,工作的原理是將數組分到有限數量的桶子里。每個桶子再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。當要被排序的數組內的數值是均勻分配的時候,桶排序使用線性時間(Θ(n))。但桶排序并不是 比較排序,他不受到 O(n log n) 下限的影響。
思路
準備桶的時候,桶的大小是原來排序數組中最大元素的值加一,然后遍歷無序的數組,把無序數組中的元素的值當成下標給到桶,每存在一個值,桶中的數量就加一。輸出的時候,桶的下標值就是之前需要排序的數組的值,只有桶中的數量大于等于一的時候才表示有數據,再進行輸出。
demo
#include <stdio.h> #include <stdlib.h>int main() {//桶排序//先準備桶 桶的大小是需要排序數組中的最大元素的值加一int app[10] = { 0 };//無序的數組int arr[9]={5,4,8,6,2,0,3,7,9};// 遍歷無序的數組,把無序數組中的元素的值當成下標給到桶for (int i = 0; i < sizeof(arr) / sizeof(int); i++){app[arr[i]]++; }//輸出,把對應的元素出現了幾次進行一個輸出for (int i = 0; i < 10; i++){for (int j = 1; j <= app[i]; j++){printf("%d ", i);}} printf("\n");return 0; }運行效果
2、冒泡排序
動圖演示
概念
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重復地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。
思路
每次進行兩兩比較,大的或者小的就往后移,每進行一次,最后一個數就是已經排好序的了。
demo
#include <stdio.h>//冒泡排序 void bullerSort(int arr[], int len) {for (int i = 0; i < len - 1; i++)//比較次數{for (int j = 0; j < len - 1 - i; j++)//比較過程{if (arr[j]>arr[j + 1])//比較{//交換int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}} } //輸出 void print(int arr[], int len) {for (int i = 0; i < len; i++){printf("%d ", arr[i]);} } int main() {int arr[10]={5,9,11,32,18,54,78,0,87,111};bullerSort(arr,10);print(arr,10);printf("\n");return 0; }運行效果
3、選擇排序
動圖演示
概念
選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
思路
n個記錄的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。具體算法描述如下:
初始狀態:無序區為R[1…n],有序區為空;
第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別為R[1…i-1]和R(i…n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1…i]和R[i+1…n)分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區;
n-1趟結束,數組有序化了。
demo
#include <stdio.h>//選擇排序 void selectSort(int arr[], int len) {for (int i = 0; i < len-1; i++){int min = i;//假設第一個元素是最小的for (int j = i + 1; j < len; j++){if (arr[j] < arr[min]){min = j;//保存最小元素的下標}}//交換int temp = arr[min];arr[min] = arr[i];arr[i] = temp;} } //輸出 void print(int arr[], int len) {for (int i = 0; i < len; i++){printf("%d ", arr[i]);} } int main() {int arr[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};selectSort(arr,15);print(arr,15);printf("\n");return 0; }運行結果
4、插入排序
動圖演示
概念
插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。
思路
一般來說,插入排序都采用in-place在數組上實現。具體算法描述如下:
- 從第一個元素開始,該元素可以認為已經被排序;
- 取出下一個元素,在已經排序的元素序列中從后向前掃描;
- 如果該元素(已排序)大于新元素,將該元素移到下一位置;
- 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
- 將新元素插入到該位置后;
- 重復步驟2~5。
demo
#include <stdio.h>//插入排序 void insertSort(int arr[], int len) {int temp;//保存要插入的元素int j;//從當前要要比較插入的元素的前面一個開始for (int i = 1; i < len; i++)//第一個元素視為有序,把后面的元素一個一個的插入到前面{temp = arr[i];j = i - 1;while (j >= 0&&arr[j]>temp){arr[j + 1] = arr[j];//前面的元素往后面移動j--;}arr[j + 1] = temp;//把要插入的元素,插入進對應的位置} } //輸出 void print(int arr[], int len) {for (int i = 0; i < len; i++){printf("%d ", arr[i]);} } int main() {int arr[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};insertSort(arr,15);print(arr,15);printf("\n");return 0; }運行效果
5、快速排序
動圖演示
概念
快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
思路
快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:
- 從數列中挑出一個元素,稱為 “基準”(pivot);
- 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到 任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作;
- 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。
demo
#include <stdio.h>//快速排序 void quickSort(int arr[], int lift, int right) {if (lift > right)return;int i = lift, j = right, temp = arr[i];//獲取左右和基準數while (i < j){while (temp < arr[j] && i < j)j--;if (i < j)arr[i++] = arr[j];while (temp>arr[i] && i < j)i++;if (i < j)arr[j--] = arr[i];}arr[i] = temp;quickSort(arr, lift, i - 1);//左邊quickSort(arr, i + 1, right);//右邊 } //輸出 void print(int arr[], int len) {for (int i = 0; i < len; i++){printf("%d ", arr[i]);} } int main() {int arr[15]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};quickSort(arr,0,14);print(arr,15);printf("\n");return 0; }運行結果
總結
以上是生活随笔為你收集整理的C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 俄罗斯方块(C语言源代码)
- 下一篇: 6、控件样式模板和使用