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