c語言冒泡排序和選擇排序的使用代碼
1.冒泡排序
冒泡排序?qū)⒁粋€列表中的兩個元素進行比較,并將最小的元素交換到頂部。兩個元素中較小的會冒到頂部,而較大的會沉到底部,該過程將被重復執(zhí)行,直到所有元素都被排序。
冒泡排序示意圖
以如圖所示的冒泡排序為例,每次比較相鄰的兩個值,值小的交換到前面,每輪結(jié)束后值最大的數(shù)交換到了最后。第一輪需要比較4次;第二輪需要比較3次;第三輪需要比較2次;第四輪需要比較1次。
那么如何用二重循環(huán)將5個數(shù)排序呢?5個數(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);//對a數(shù)組中的數(shù)進行排序 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ù)放在第一個位置上的算法,當然也可以用前面所講的冒泡排序法,現(xiàn)在我們改用一種新的算法: 其指導思想是先并不急于調(diào)換位置,先從a[0]開始逐個檢查,看哪個數(shù)最小,就記下該數(shù)所在的位置p,等一躺掃描完畢,再把a[p]和a[0]對調(diào),這時a[0] a[9]最小的數(shù)據(jù)就換到了最前面的位置。算法的步驟如下。
(1)先假設a[0]的數(shù)最小,記下此時的位置p。
(2)依次把a[p]和a[i](從2變化到9)進行比較,每次比較時,若a[j]的數(shù)比a[p]中的數(shù)小,則把i的值賦給p,使p總是指向當前所掃描過的最小數(shù)的位置,也就是說a[p]總是等于所有掃描過的數(shù)中最小的那個數(shù)。在依次一一比較后,p就指向 10個數(shù)中 最小的數(shù)所在位置,即a[p]就是10 個數(shù)中最小的那個數(shù)。
(3)把a[p]和a[0]的數(shù)對調(diào),那么最小的數(shù)就在a[0]中了,也就是在最前面了。
如果現(xiàn)在重復此算法,但每重復一次, 進行比較的數(shù)列范圍就向后移動一個位置,即第二遍比較時范圍就從第2個數(shù)一直到第 n個數(shù),在此范圍內(nèi)找最小的數(shù)的位置p,然后把a[p]與a[2]對調(diào),這樣從第2個數(shù)開始到第n個數(shù)中,最小數(shù)就在a[2]中了,第三遍就從第個數(shù)到第n 個數(shù)中去找最小的數(shù),再把a[p]與a[3]對調(diào)..此過程重復n-1次后,就把a組中n個數(shù)按從小到大的順序排好了。這種排序的方法就是選擇排序法。
下面我們定義一個臨時變量temp代替a[p],進行排序。
選擇排序修改為:從鍵盤輸入的十個整數(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.冒泡排序是比較相鄰位置的兩個數(shù),而選擇排序是按順序比較,找最大值或者最小值;
2.冒泡排序每一輪比較后,位置不對都需要換位置,選擇排序每一輪比較都只需要換一次位置;
3.冒泡排序是通過數(shù)去找位置,選擇排序是給定位置去找數(shù);
冒泡排序優(yōu)缺點
1.優(yōu)點:比較簡單,空間復雜度較低,是穩(wěn)定的;
2.缺點:時間復雜度太高,效率慢;
選擇排序優(yōu)缺點
1.優(yōu)點:一輪比較只需要換一次位置;
2.缺點:效率慢,不穩(wěn)定(舉個例子5,8,5,2,9 我們知道第一遍選擇第一個元素5會和2交換,那么原序列中2個5的相對位置前后順序就破壞了)。
總結(jié)
到此這篇關(guān)于c語言冒泡排序和選擇排序使用的文章就介紹到這了,更多相關(guān)c語言冒泡排序和選擇排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言動態(tài)內(nèi)存管理的原理及實現(xiàn)方法
C語言動態(tài)內(nèi)存管理的原理是通過 malloc() 函數(shù)申請一塊連續(xù)的內(nèi)存空間,并返回其地址,通過 free() 函數(shù)釋放該內(nèi)存空間。實現(xiàn)方法是通過在程序運行時動態(tài)地管理內(nèi)存,即在需要內(nèi)存時申請,不需要時釋放,避免了靜態(tài)內(nèi)存分配的浪費和不足2023-04-04Linux下C語言的幾道經(jīng)典面試題小結(jié)(分享)
下面小編就為大家?guī)硪黄狶inux下C語言的幾道經(jīng)典面試題小結(jié)(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05