c語言冒泡排序和選擇排序的使用代碼
1.冒泡排序
冒泡排序?qū)⒁粋€(gè)列表中的兩個(gè)元素進(jìn)行比較,并將最小的元素交換到頂部。兩個(gè)元素中較小的會冒到頂部,而較大的會沉到底部,該過程將被重復(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);//對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]對調(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ù)對調(diào),那么最小的數(shù)就在a[0]中了,也就是在最前面了。
如果現(xiàn)在重復(fù)此算法,但每重復(fù)一次, 進(jìn)行比較的數(shù)列范圍就向后移動一個(gè)位置,即第二遍比較時(shí)范圍就從第2個(gè)數(shù)一直到第 n個(gè)數(shù),在此范圍內(nèi)找最小的數(shù)的位置p,然后把a(bǔ)[p]與a[2]對調(diào),這樣從第2個(gè)數(shù)開始到第n個(gè)數(shù)中,最小數(shù)就在a[2]中了,第三遍就從第個(gè)數(shù)到第n 個(gè)數(shù)中去找最小的數(shù),再把a(bǔ)[p]與a[3]對調(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.冒泡排序每一輪比較后,位置不對都需要換位置,選擇排序每一輪比較都只需要換一次位置;
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會和2交換,那么原序列中2個(gè)5的相對位置前后順序就破壞了)。
總結(jié)
到此這篇關(guān)于c語言冒泡排序和選擇排序使用的文章就介紹到這了,更多相關(guān)c語言冒泡排序和選擇排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C字符串操作函數(shù)實(shí)現(xiàn)方法小結(jié)
這篇文章主要介紹了C字符串操作函數(shù)實(shí)現(xiàn)方法,實(shí)例總結(jié)了C語言字符串操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04

