標(biāo)題: C語言選擇排序算法 程序源碼詳細(xì)分析 [打印本頁(yè)]

作者: piaolin    時(shí)間: 2015-10-1 13:38
標(biāo)題: C語言選擇排序算法 程序源碼詳細(xì)分析
        選擇排序的思想是在一個(gè)無序的數(shù)列中先找到最小值,其次將其存儲(chǔ)到數(shù)列的最前列或最后列,達(dá)到數(shù)列由小到大大或有大到小的排列效果。排序算法在實(shí)際應(yīng)用中是非常實(shí)用的,個(gè)人主要用于數(shù)字濾波。本代碼是學(xué)習(xí)x甲魚《數(shù)據(jù)結(jié)構(gòu)與算法》的筆記。代碼可以直接復(fù)制到Microsoft Visual C++編譯軟件運(yùn)行。代碼用自己理解的語言做了詳細(xì)注釋。在自己的四軸飛行器電位器調(diào)速程序中就運(yùn)用了該函數(shù)。

       閑來無聊玩手機(jī)時(shí)可以看看這個(gè),練練大腦。
      

  1. #include<stdio.h>
  2. void SelectSort(int k[],int n)  //在這個(gè)函數(shù)里,因?yàn)闆]有返回值,所以不能用return語句;int *k也可以
  3. {               /* 根據(jù)C語言知識(shí):形參“int k[]”是數(shù)組入口地址,每個(gè)元素占用4個(gè)字節(jié),形參數(shù)組共占用4*n個(gè)字節(jié) */
  4.      int i,j,temp,min,count1=0,count2=0 ;      //加入count1,count2是為了計(jì)算程序復(fù)雜度
  5.    for(i=0;i<n-1;i++)
  6.     {
  7.           min=i;           //保證從首元素開始逐個(gè)比較,這一句很重要!
  8.        for(j=i+1;j< n;j++)//“j=i+1”本元素和下一個(gè)元素
  9.        {
  10.               // count1++;
  11.    
  12.      if(k[j]<k[min])//注意!這里如果改成“k[j]>k[min]”就是反序排列了!
  13.      {
  14.            /* 如果下一個(gè)元素比前一個(gè)元素大,就將二者位置交換,確保k[min]是該數(shù)列中的最小值 */
  15.                 /* 通過這一層for循環(huán)將最小值與數(shù)列中每個(gè)元素比較一次,并交換位置確保將該數(shù)列中的最小值存放在i指針處 */
  16.               count1++;            //比較次數(shù)
  17.              min=j;             //貌似簡(jiǎn)單,卻有技術(shù)含量!確保k[min]是該輪循環(huán)比較中的最小值
  18.             //換句話說,在該輪循環(huán)比較中讓每一個(gè)元素與最小值k[min]比較,最終實(shí)現(xiàn)確保k[min]是該數(shù)列中的最小值
  19.      }

  20.     }
  21.     if(min!=i)//如果min不等于i,說明位置發(fā)生了交換;并將最小值交換到數(shù)序前列;
  22.     {
  23.          temp=k[min];
  24.          k[min]=k[i];
  25.          k[i]=temp; //將最小值存放在數(shù)序前列;
  26.           count2++; //計(jì)算交換位置次數(shù)
  27.    
  28.     }
  29. }
  30.   printf("總共進(jìn)行了%d次比較,進(jìn)行了%d次移動(dòng)" ,count1,count2);
  31. }

  32. int main(void)//比較,輸出最大值
  33. {
  34.   
  35. // int m, a[10]={ 0,1,5,4,2,3,6,8 ,7,9};
  36. //  int m, a[10]={ 9,7,0,1,2,3,4,5,6,8 };  //那么排序的效率就大大增加了;
  37.    int m, a[10]={25,10,7,2,34,6,6,8 ,9,0};//那么排序的效率就大大增加了;
  38.     SelectSort( a,10);
  39.    printf("排序后的結(jié)果是:\n\r" );
  40.    for(m=0;m<10;m++)
  41.    {
  42.    
  43.       printf("%d\n\r" ,a[m]);
  44.   
  45.    }
  46.    // printf("\n\n" );

  47. return 0; //結(jié)束主函數(shù)
  48. }
復(fù)制代碼



/* 本例程學(xué)習(xí):選擇排序的效率比優(yōu)化后的冒泡排序效率略高,更易理解   */

-----王衍









歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1