26、最常用的兩種排序:冒泡和選擇

1、  冒泡排序

輸入:數組名稱(也就是數組首地址)、數組中元素個數。算法思想簡單描述:

在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。下面是一種改進的冒泡算法,它記錄了每一遍掃描後最後下沉數的位置k,這樣可以減少外層循環掃描的次數。

冒泡排序是穩定的,算法時間複雜度O(n2)。

程序如下:

void bubble_sort(int*x, int n)

{

 int j, k, h, t;

 for (h=n-1; h>0; h=k) /*循環到沒有比較範圍*/

 {

  for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描後更新k*/

  {

   if (*(x+j) > *(x+j+1)) /*大的放在後面,小的放到前面*/

   {

    t = *(x+j);

    *(x+j) = *(x+j+1);

    *(x+j+1) = t;     /*完成交換*/

    k = j; /*保存最後下沉的位置。這樣k後面的都是排序排好了的。*/

    }//if

  }//for

 }//for

}//bubble_sort

也可以是如下格式:

void BubbleSort(inta[],int n)

{

 int i,j;

 int change;

 int temp;

 for(i=n-1,change=TURE;i>=1&&change;i--)

 {

 change=FLASE;

 for(j=1;j<=i;j++)

    if(a[j]>a[j+1])

    {

     temp=a[j];

     a[j]=a[j+1];

     a[j+1]=temp;

     change=TURE;

    }//if

 }//for

}//BubbleSort

排序過程中沒有進行過交換記錄的操作。如圖中見,小的數往上漂浮,大的數往小沉。

2、 選擇排序

輸入:數組名稱(也就是數組首地址)、數組中元素個數

算法思想簡單描述:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較爲止。選擇排序是不穩定的。算法複雜度O(n2).

程序如下:

void select_sort(int*x, int n)

{

 int i, j, min, t;

 for (i=0; i<n-1; i++) /*要選擇的次數:0~n-2共n-1次*/

 {

  min = i; /*假設當前下標爲i的數最小,比較後再調整*/

  for (j=i+1; j<n; j++)/*循環找出最小的數的下標是哪個*/

  {

   if (*(x+j) < *(x+min))

   {   

    min = j; /*如果後面的數比前面的小,則記下它的下標*/

   }//if

  } //for 

  if (min != i) /*如果min在循環中改變了,就需要交換數據*/

  {

   t = *(x+i);

   *(x+i) = *(x+min);

   *(x+min) = t;

  }//if

 }//for

}//select_sort

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