1樓:
下面是c語言裡面常用的三種排序方法,但願對樓主有幫助,
一、冒泡法(起泡法)
演算法要求:用起泡法對10個整數按升序排序。
演算法分析:如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次相鄰元素的兩兩比較,在第j趟比較中要進行n-j次兩兩比較。
比較的順序從前往後,經過一趟比較後,將最值沉底(換到最後一個元素位置),最大值沉底為升序,最小值沉底為降序。
演算法源**:
# include
main()
/*輸出排序結果*/
printf("the sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}演算法特點:相鄰元素兩兩比較,每趟將最值沉底即可確定一個數在結果的位置,確定元素位置的順序是從後往前,其餘元素可能作相對位置的調整。可以進行升序或降序排序。
演算法分析:定義n-1次迴圈,每個數字比較n-j次,比較前一個數和後一個數的大小。然後交換順序。
二、選擇法
演算法要求:用選擇法對10個整數按降序排序。
演算法分析:每趟選出一個最值和無序序列的第一個數交換,n個數共選n-1趟。第i趟假設i為最值下標,然後將最值和i+1至最後一個數比較,找出最值的下標,若最值下標不為初設值,則將最值元素和下標為i的元素交換。
演算法源**:
# include
main()
printf("the sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}演算法特點:每趟從無序序列中取出第一個數插入到有序序列的合適位置,元素的最終位置在最後一趟插入後才能確定位置。也可是先用迴圈查詢插入位置(可從前往後或從後往前),再將插入位置之後的元素(有序列中)逐個後移一個位置,最後完成插入。
該演算法的特點是在尋找插入位置的同時完成元素的移動。因為元素的移動必須從後往前,則可將兩個操作結合在一起完成,提高演算法效率。仍可進行升序或降序排序。
二、下面是三種排序的概念及其優缺點
氣泡排序
已知一組無序資料a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則不變。
再比較a[3]與a[4],依此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組資料中最大的。再對a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。
再對a[1]~a[n-2]以相同方法處理一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。
優點:穩定,比較次數已知;
缺點:慢,每次只能移動相鄰兩個資料,移動資料的次數多。
選擇排序
已知一組無序資料a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大於a[3]則交換兩者的值,否則不變。
再比較a[1]與a[4],依此類推,最後比較a[1]與a[n]的值。這樣處理一輪後,a[1]的值一定是這組資料中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。
再將a[3]與a[4]~a[n]以相同方法比較一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。
優點:穩定,比較次數與氣泡排序一樣,資料移動次數比氣泡排序少;
缺點:相對之下還是慢。
插入排序
已知一組升序排列資料a[1]、a[2]、……a[n],一組無序資料b[1]、b[2]、……b[m],需將二者合併成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a陣列中某一資料a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。
(若無陣列a,可將b[1]當作n=1的陣列a)
優點:穩定,快;
缺點:比較次數不一定,比較次數越少,插入點後的資料移動越多,特別是當資料總量龐大的時候,但用連結串列可以解決這個問題。
2樓:**設御午
key)
a[i+1]=key,j++)
希望給你點啟發
3樓:天平座de魚
心語的眼淚的兩種排序的話還是比較考驗人性的,我覺得。
4樓:匿名使用者
c語言排序細分不僅兩種。。。
5樓:紅塵風雨n百年
氣泡排序和選擇排序?
c語言給n個字串排序問題
6樓:匿名使用者
問題比較多:
在交換那裡,不能直接用賦地址來給新串賦值,要給臨時串申請新同大小的空間,然後用strcpy來實現賦值完成交換。
在錄入字串時,誤用%s,應用%c。或者是p而不是p[i]下面給個我修改的程式:
#include
#include
#include
void sortstr(char *a, int n)free(temp);
}int main()
for (i = 0; i < n; i++)sortstr(q, n);
for (i = 0; i < n; i++)printf("\n");
return 0;}
請問c語言中用冒泡法對n個整數進行排序怎麼弄,求程式
include include include define n 50 void bubblesort int a,int n int main void i 0 srand time null for i 0 i n i printf d a i rand 100 printf n排序後 n bu...
C語言程式設計 將輸入的N個整數採用氣泡排序按照從小到大的順序排列並且輸出
include stdio.h include stdlib.h int main break case 1 case 2 break case 2 switch q int l for l 0 l printf n n system pause void bubblesort int l 輸入10...
由主函式呼叫排序子函式,對n個整數進行從小到大的排序,如何用
include void sort int a,int n int main sort a,10 int i for i 0 i 10 i getchar return 0 c語言程式設計 氣泡排序法。要求 由主函式呼叫排序子函式,對n個整數進行從小到大的排序,謝了 include void sor...