關於sort排序的個人理解



例:用選擇法對數組中10個整數按由小到大排序。

解題思路:
所謂選擇法就是先將10個數中最小的數與a[0]對換,再將a[1]~a[9]中最小的數與a[1]對換······每比較一輪,找出一個未經排序的數中最小的一個。共比較9輪。
如下圖:

a[0] a[1] a[2] a[3] a[4]
3 6 1 9 4
1 6 3 9 4
1 3 6 9 4
1 3 4 9 6
1 3 4 6 9

代碼如下

#include<stdio.h>  
2.void sort(int a[],int n)  
3.{  
4.    int i,j,k,t;  
5.    for(i=0;i<n-1;i++)//因爲i需與後面的元素比較,所以i最多是倒數第二個元素   
6.    {  
7.        k=i;  
8.        for(j=i+1;j<n;j++)//同上,j需與前面的元素比較,所以j最小爲i後的第一個元素   
9.        {  
10.            if(a[j]<a[k]) k=j;  
11.        }  
12.        t=a[k];a[k]=a[i];a[i]=t;//注意此處只有i和k   
13.    }  
14.}  
15.  
16.int main()  
17.{  
18.    int s[10],i;  
19.    for(i=0;i<10;i++)  
20.        scanf("%d",&s[i]);  
21.    sort(s,10);  
22.    for(i=0;i<10;i++)  
23.        printf("%d ",s[i]);  
24.    printf("\n");  
25.    return 0;  
26.}  

初識sort排序:
一、把i的值賦予k,讓k替i與j比較(爲了不改變i的值);
二、① 如果a[k]大於a[i](此時a[k]即a[i]的值),則用k記錄下j的值,即記錄下需要與a[i]交換的元素的序號
②如果a[k]不大於a[i],此時不需交換故k不需記錄下序號,此時k仍是i的值
三、交換:i變化的每輪都有a[i]與a[k]交換值的環節(即調用的sort函數中的最後一部分),如果是①條件下的k,則a[i]與此時k記錄下序號的元素互換,a[i]換爲兩者的最小值;如果是②條件下的k,則k的值即是i的值,則交換後a[i]值仍爲原值,即不互換。(綜上:k是替死鬼???)

冒泡法:若是if (arr[j]< arr[j+1])  ,則數據從大到小排序,若是if(arr[j] > arr[j+1])  ,則數據從小到大排序。

選擇法:若是if (arr[i] < arr[j])  ,則數據從大到小排序,若是if (arr[i] >arr[j])  ,則數據從小到大排序。

冒泡法與選擇法:若有n個數據,則需進行n-1輪比較,第i輪需進行n-i次比較。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章