1. 程式人生 > >基本氣泡排序與演算法改進

基本氣泡排序與演算法改進

氣泡排序基本思想,相鄰兩數一次比較,按照要求順序交換。
這裡寫圖片描述

#include <stdio.h> 

void BubbleSort(int *Array,int n);
//*Array,待排陣列;n,陣列大小

int main()
{
    int Array[8]={5,9,2,16,7,4,12,15};
    int i;
    printf("待排序陣列:\n");
    for(i=0;i<8;i++)
        printf("%d ",*(Array+i));
    BubbleSort(Array,8);
    printf("\n氣泡排序後的陣列為:\n"
); for(i=0;i<8;i++) printf("%d ",*(Array+i)); } //基本冒泡演算法 void BubbleSort(int *Array,int n) { int temp,i,j; for(i=n-1;i>0;i--) for(j=0;j<i;j++) if(*(Array+j)>*(Array+j+1)) { temp= *(Array+j); *(Array+j) = *(Array
+j+1); *(Array+j+1) = temp; } } /*通過分析我們可以知道在每一趟冒泡比較之後,若發現從某個位置r開始, 不再進行記錄交換,就說明Array[r+1]到Array[n-1]已經排好序, 因此下一趟比較只要進行到位置r就行。若某一趟掃描中沒有記錄交換, 這說明所有元素都已有序,演算法可以結束,而不用進行n-1次掃描。 冒泡演算法改進,用變數m記錄資料最後一次交換位置記錄資料最後一次交換位置*/ void BubbleSort(int *Array,int n) { int bound=n; int m,i; int temp; while
(bound!=0) { m=0; for(i=0;i<bound;i++) { if(*Array+i)>*(Array+i+1) { temp= *(Array+j); *(Array+j) = *(Array+j+1); *(Array+j+1) = temp; m=i; } } bound=m; } } /*以上都是單向排序,即大樹均往下沉,經過一次比較可以 把最大數的記錄送到最後的位置。其實我們可以在使大數往下 的同時讓小數往上升,這樣一次掃描就可以將最大的和最小的 記錄放到最終位置上,這就是雙向氣泡排序思想; 演算法改進,雙向排序,大數往下,小數往上*/ void BubbleSort(int *Array,int n) { int boundmin=0; int boundmax=n; int min,max,i; int temp; while(boundmin<boundmax) { min=0; max=0; for(i=boundmin;i<boundmax;i++) //大數往下沉 { if(*Array+i)>*(Array+i+1)) { temp= *(Array+j); *(Array+j) = *(Array+j+1); *(Array+j+1) = temp; max=i; //max記錄下沉時候最後一次發生資料交換的位置 } } if(max==0) //本次掃描沒有記錄交換,掃描結束 break; boundmax=max; for(i=boundmax-1;i>boundmin;i--) //小數往上升 { if(*(Array+i)<*(Array+i-1)) { swap(*(Array+j),*(Array+j),temp); min=i; } } if(min==0) break; boundmin=min; } }