選擇排序算法和冒泡算法的區別


/選擇排序法對數組中的n個數,由小到大排序
#include<stdio.h>
 main()
 {
    int n=10,i,b,a[10];
    int sort(int array[],int n);
    // scanf("%d",&10);
    for(i=0;i<10;i++)//鍵盤輸入數組元素
    scanf("%d",&a[i]);
    sort(a,10);//調用函數
    for(i=0;i<10;i++)//輸出排序之后的函數
    printf("%3d",a[i]);

}
   //排序子函數錯誤!!!!這是冒泡的思想!!!
 //int sort(int array[],int n)//排序子函數
 {
     int i,j,k,t;
     for(i=0;i<n-1;i++)//需要比較n-1次
   {
       //k=i;
       for(j=i+1;j<n;j++)//第i次比較,與第i+1個數開始比較
         {
              if(array[j]<array[i])
               {
                  t=array[i];
                  array[i]=array[j];
                  array[j]=t;
               }
         }
    }

  }
//下面是正確的子函數
   int sort(int array[],int n)//排序函數
 {
     int i,j,k,t;
     for(i=0;i<n-1;i++)//需要比較n-1次
   {
        k=i;
        for(j=i+1;j<n;j++)//第i次比較,與第i+1個數開始比較
           if(array[j]<array[k])
           k=j;//for(j)函數到這里結束了!!!!
        t=array[i];
        array[i]=array[k];
        array[k]=t;
    }
 }

//冒泡排序法對數組中的n個數,由小到大排序
#include<stdio.h>
main()
{
    int sort(int array[],int n);
    int n=10,i,j,k,a[10];
    printf("請輸入10個數:\n");
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    sort (a,10);
    printf("輸出排序后的10個數:\n");
    for(i=0;i<10;i++)
    printf("%2d",a[i]);
}
int sort(int array[],int n)
{
    int i,j,k;
    for (j=0;j<9;j++)
    {

     for(i=0;i<9-j;i++)
     {
        if(array[i]>array[i+1])
        {
            k=array[i];
            array[i]=array[i+1];
            array[i+1]=k;
        }
     }
    }
}

選擇法:

     假定a[0]為最值,先將10個數中最小的數與a[0]對換,(只有這倆對換,其余位置不變!!!)再將a[1]~a[9]中最小的數與a[1]對換......每比較一輪,找出未經排序的最小的數。以5個數為例子說明:

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

   2      5      0       8       3

[0]      5     [2]      8       3   將5個數中最小的與a[0]對換

0       [2]    [5]      8       3   將余下的4個數中最小的與a[1]對換

0        2     [3]      8      [5]   將余下的3個數中最小的與a[2]對換

0        2      3      [5]     [8]   將余下的2個數中最小的與a[3]對換

完成排序

選擇排序法的復雜度:O(n*n)

 

冒泡排序法:

     臨近數字兩兩依次比較,按從小到大或從大到小順序交換,一趟過去之后,最大或最小的數字被交換到了最后一位。再從頭開始比較,直到倒數第二位。

以5個數為例子說明:

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

                                     2      5      0        8       3

第一趟:第一次兩兩比較:   2      0      5        8       3

           第一次兩兩比較:   2      0      5        3     [ 8 ]

第二趟:                         0      2      3     [  5       8 ]

第三趟:                         0      2   [  3        5       8 ]

第四趟:                         0   [  2      3        5       8 ]

完成排序。

冒泡排序法的復雜度:O(n*n)。

兩者都是效率比較低的排序方法。

     我最開始把選擇和冒泡搞混了,選擇的思想在於每次只有最值和第i個數對換,其余都保持原位不變!!!所以子函數里面,for循環里面的小for循環,只是把j賦給k,繼續小for循環 ,不交換a[j]和a[k]的值。到外面的大for循環再交換a[j]和a[k]的值,這樣就實現了選擇排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM