c語言排序算法瞭解

1)「冒泡法」 

       冒泡法你們都較熟悉。其原理爲從a[0]開始,依次將其和後面的元素比較,若a[0]>a,則交換它們,一直比較到a[n]。同理對a[1],a[2],...a[n-1]處理,即完成排序。下面列出其代碼:  

C/C++ code 算法

void bubble(int *a,int n) /*定義兩個參數:數組首地址與數組大小*/

int i,j,temp; 
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++) /*注意循環的上下限*/
if(a>a[j]) { 
                temp=a; 
                a=a[j]; 
                a[j]=temp; 
            } 

shell

 冒泡法原理簡單,但其缺點是交換次數多,效率低。  下面介紹一種源自冒泡法但更有效率的方法「選擇法」。   數組


2)「選擇法」 

       選擇法循環過程與冒泡法一致,它還定義了記號k=i,而後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.最後看看k=i是否還成立,不成立則交換a[k],a,這樣就比冒泡法省下許多無用的交換,提升了效率。  

C/C++ code ui

void choise(int *a,int n) 

int i,j,k,temp;
for(i=0;i<n-1;i++) 
    { 
        k=i; /*給記號賦值*/ 
for(j=i+1;j<n;j++) 
if(a[k]>a[j]) k=j; /*是k老是指向最小元素*/
if(i!=k) { /*當k!=i是才交換,不然a即爲最小*/ temp=a; 
                a=a[k]; 
                a[k]=temp; 
            } 
    } 

spa



       選擇法比冒泡法效率更高,但說到高效率,非「快速法」莫屬,如今就讓咱們來了解它。  

3)「快速法」
  
       快速法定義了三個參數,(數組首地址*a,要排序數組起始元素下標i,要排序數組結束元素下標j). 它首先選一個數組元素(通常爲a[(i+j)/2],即中間元素)做爲參照,把比它小的元素放到它的左邊,比它大的放在右邊。而後運用遞歸,在將它左,右兩個子數組排序,最後完成整個數組的排序。下面分析其代碼:  

C/C++ code code

void quick(int *a,int i,int j) 
{
int m,n,temp; 
int k; 
    m=i; 
    n=j; 
    k=a[(i+j)/2]; /*選取的參照*/ 
do { 
while(a[m]<k && m<j) m++; /* 從左到右找比k大的元素*/
while(a[n]>k && n>i) n--; /* 從右到左找比k小的元素*/ 
if(m<=n) { /*若找到且知足條件,則交換*/
temp=a[m]; 
            a[m]=a[n]; 
            a[n]=temp; 
            m++; 
            n--; 
        } 
    }while(m<=n); 
if(m<j) quick(a,m,j); /*運用遞歸*/ 
if(n>i) quick(a,i,n); 

排序


4)「插入法」 

       插入法是一種比較直觀的排序方法。它首先把數組頭兩個元素排好序,再依次把後面的元素插入適當的位置。把數組元素插完也就完成了排序。  

C/C++ code 遞歸

void insert(int *a,int n) 

int i,j,temp; 
for(i=1;i<n;i++) { 
        temp=a; /*temp爲要插入的元素*/ 
j=i-1; 
while(j>=0&&temp<a[j]) { /*從a開始找比a小的數,同時把數組元素向後移*/ 
a[j+1]=a[j]; 
            j--; 
        } 
        a[j+1]=temp; /*插入*/ } 

效率


5)「shell法」 

       shell法是一個叫 shell 的美國人與1969年發明的。它首先把相距k(k>=1)的那幾個元素排好序,再縮小k值(通常取其一半),再排序,直到k=1時完成排序。下面讓咱們來分析其代碼:

C/C++ code 原理

void shell(int *a,int n) 

int i,j,k,x; 
    k=n/2; /*間距值*/
while(k>=1) { 
for(i=k;i<n;i++) { 
            x=a; 
            j=i-k;
while(j>=0&&x<a[j]) { 
                a[j+k]=a[j]; 
                j-=k; 
            } 
            a[j+k]=x; 
        } 
        k/=2; /*縮小間距值*/ } 


6)希爾排序

       算法思想簡單描述:在直接插入排序算法中,每次插入一個數,使有序序列只增長1個節點,而且對插入下一個數沒有提供任何幫助。若是比較相隔較遠距離(稱爲增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。D.L.shell於1959年在以他名字命名的排序算法中實現了這一思想。

       算法先將要排序的一組數按某個增量d分紅若干組,每組中記錄的下標相差d.對每組中所有元素進行排序,而後再用一個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分紅一組,排序完成。

C/C++ code

void shell_sort(int *x, int n) {  int h, j, k, t;  for (h=n/2; h>0; h=h/2) /*控制增量*/ {  for (j=h; j<n; j++) /*這個實際上就是上面的直接插入排序*/ {             t = *(x+j); for (k=j-h; (k>=0 && t<*(x+k)); k-=h)             { *(x+k+h) = *(x+k);             }  *(x+k+h) = t;         }     } } 

相關文章
相關標籤/搜索