c語言冒泡排序和選擇排序的使用代碼
1.冒泡排序
冒泡排序?qū)⒁粋€(gè)列表中的兩個(gè)元素進(jìn)行比較,并將最小的元素交換到頂部。兩個(gè)元素中較小的會(huì)冒到頂部,而較大的會(huì)沉到底部,該過程將被重復(fù)執(zhí)行,直到所有元素都被排序。
冒泡排序示意圖
以如圖所示的冒泡排序?yàn)槔?,每次比較相鄰的兩個(gè)值,值小的交換到前面,每輪結(jié)束后值最大的數(shù)交換到了最后。第一輪需要比較4次;第二輪需要比較3次;第三輪需要比較2次;第四輪需要比較1次。
那么如何用二重循環(huán)將5個(gè)數(shù)排序呢?5個(gè)數(shù)存放在一維數(shù)組中,外層循環(huán)控制比較多少輪,循環(huán)變量i;內(nèi)層控制每輪比較多少次,循環(huán)變量就,如下圖所示:
代碼如下:
#include <stdio.h> #define NUM 5 void arrsort(int[],int); void arrout(int[],int); main(){ int a[NUM]={16,25,9,90,23}; arrout(a,NUM);//輸出a數(shù)組中原始數(shù)據(jù) arrsort(a,NUM);//對(duì)a數(shù)組中的數(shù)進(jìn)行排序 arrout(a,NUM);//輸出排序后a數(shù)組中的數(shù)據(jù) } void arrsort(int a[],int n){ for(int i=0;i<n-1;i++){ for(int j=0;j<n-1-i;j++){ if(a[j]>a[j+1]){ int temp =a[j+1]; a[j+1] = a[j]; a[j] = temp; } } } } void arrout(int a[],int n){ int i; for(i=0;i<n;i++){ printf("%3d",a[i]); } printf("\n"); }
輸出結(jié)果為:
2.選擇排序
在介紹選擇排序法之前,憑介紹一種把最小的數(shù)放在第一個(gè)位置上的算法,當(dāng)然也可以用前面所講的冒泡排序法,現(xiàn)在我們改用一種新的算法: 其指導(dǎo)思想是先并不急于調(diào)換位置,先從a[0]開始逐個(gè)檢查,看哪個(gè)數(shù)最小,就記下該數(shù)所在的位置p,等一躺掃描完畢,再把a(bǔ)[p]和a[0]對(duì)調(diào),這時(shí)a[0] a[9]最小的數(shù)據(jù)就換到了最前面的位置。算法的步驟如下。
(1)先假設(shè)a[0]的數(shù)最小,記下此時(shí)的位置p。
(2)依次把a(bǔ)[p]和a[i](從2變化到9)進(jìn)行比較,每次比較時(shí),若a[j]的數(shù)比a[p]中的數(shù)小,則把i的值賦給p,使p總是指向當(dāng)前所掃描過的最小數(shù)的位置,也就是說a[p]總是等于所有掃描過的數(shù)中最小的那個(gè)數(shù)。在依次一一比較后,p就指向 10個(gè)數(shù)中 最小的數(shù)所在位置,即a[p]就是10 個(gè)數(shù)中最小的那個(gè)數(shù)。
(3)把a(bǔ)[p]和a[0]的數(shù)對(duì)調(diào),那么最小的數(shù)就在a[0]中了,也就是在最前面了。
如果現(xiàn)在重復(fù)此算法,但每重復(fù)一次, 進(jìn)行比較的數(shù)列范圍就向后移動(dòng)一個(gè)位置,即第二遍比較時(shí)范圍就從第2個(gè)數(shù)一直到第 n個(gè)數(shù),在此范圍內(nèi)找最小的數(shù)的位置p,然后把a(bǔ)[p]與a[2]對(duì)調(diào),這樣從第2個(gè)數(shù)開始到第n個(gè)數(shù)中,最小數(shù)就在a[2]中了,第三遍就從第個(gè)數(shù)到第n 個(gè)數(shù)中去找最小的數(shù),再把a(bǔ)[p]與a[3]對(duì)調(diào)..此過程重復(fù)n-1次后,就把a(bǔ)組中n個(gè)數(shù)按從小到大的順序排好了。這種排序的方法就是選擇排序法。
下面我們定義一個(gè)臨時(shí)變量temp代替a[p],進(jìn)行排序。
選擇排序修改為:從鍵盤輸入的十個(gè)整數(shù)按升序排列輸出
#include <stdio.h> void main(){ int i,j,k; int a[10]; for(k=0;k<10;k++){ scanf("%d",&a[k]); } for(i=0;i<9;i++){ for(j=i+1;j<10;j++){ if(a[i]>a[j]){ int temp = a[j]; a[j] = a[i]; a[i] = temp; } } } for(i=0;i<10;i++){ printf("%d ",a[i]); } }
區(qū)別
1.冒泡排序是比較相鄰位置的兩個(gè)數(shù),而選擇排序是按順序比較,找最大值或者最小值;
2.冒泡排序每一輪比較后,位置不對(duì)都需要換位置,選擇排序每一輪比較都只需要換一次位置;
3.冒泡排序是通過數(shù)去找位置,選擇排序是給定位置去找數(shù);
冒泡排序優(yōu)缺點(diǎn)
1.優(yōu)點(diǎn):比較簡單,空間復(fù)雜度較低,是穩(wěn)定的;
2.缺點(diǎn):時(shí)間復(fù)雜度太高,效率慢;
選擇排序優(yōu)缺點(diǎn)
1.優(yōu)點(diǎn):一輪比較只需要換一次位置;
2.缺點(diǎn):效率慢,不穩(wěn)定(舉個(gè)例子5,8,5,2,9 我們知道第一遍選擇第一個(gè)元素5會(huì)和2交換,那么原序列中2個(gè)5的相對(duì)位置前后順序就破壞了)。
總結(jié)
到此這篇關(guān)于c語言冒泡排序和選擇排序使用的文章就介紹到這了,更多相關(guān)c語言冒泡排序和選擇排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)讀寫ini配置文件的示例代碼
配置文件的讀取是每個(gè)程序必備的功能,配置文件的格式多種多樣,例如:ini格式、json格式、xml格式等。其中屬ini格式最為簡單,且應(yīng)用廣泛。本文和大家分享了C++讀寫ini配置文件的方法,需要的可以參考一下2023-05-05C++實(shí)現(xiàn)銀行排隊(duì)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)銀行排隊(duì)系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07C語言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例
這篇文章主要介紹了C語言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02C語言動(dòng)態(tài)內(nèi)存管理的原理及實(shí)現(xiàn)方法
C語言動(dòng)態(tài)內(nèi)存管理的原理是通過 malloc() 函數(shù)申請(qǐng)一塊連續(xù)的內(nèi)存空間,并返回其地址,通過 free() 函數(shù)釋放該內(nèi)存空間。實(shí)現(xiàn)方法是通過在程序運(yùn)行時(shí)動(dòng)態(tài)地管理內(nèi)存,即在需要內(nèi)存時(shí)申請(qǐng),不需要時(shí)釋放,避免了靜態(tài)內(nèi)存分配的浪費(fèi)和不足2023-04-04使用C語言實(shí)現(xiàn)本地socke通訊的方法
這篇文章主要介紹了?使用C語言實(shí)現(xiàn)本地socke通訊,代碼分為服務(wù)器代碼和客戶端代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12Linux下C語言的幾道經(jīng)典面試題小結(jié)(分享)
下面小編就為大家?guī)硪黄狶inux下C語言的幾道經(jīng)典面試題小結(jié)(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05