C語言中冒泡排序及優化

/** 指針指向調換,也是內容調換 */
void swap(int *a,int *b)
{
//    int tmp;
//    tmp = *a;
//    *a = *b;
//    *b = tmp;
    *a = *a^*b;
    *b = *b^*a;
    *a = *a^*b;
}

這是調換兩個直的方法。數組

舉個例子解釋下先,其實寫完我仍是有點繞暈。優化

假如a=3,b=4。想將a和b的值互換,能夠用如下賦值語句實現:指針

  a=a∧b;
  b=b∧a;
  a=a∧b;code

  能夠用下面的豎式來講明:排序

即等效於如下兩步:class

  ① 執行前兩個賦值語句:「a=a∧b;」和「b=b∧a;」至關於b=b∧(a∧b)。而b∧a∧b等於a∧b∧b。b∧b的結果爲0,由於同一個數與自己相∧,結果必爲0。所以b的值等於a∧0,即a,其值爲3。object

  ② 再執行第三個賦值語句:a=a∧b。因爲a的值等於(a∧b),b的值等於(b∧a∧b),所以,至關於a=a∧b∧b∧a∧b,即a的值等於a∧a∧b∧b∧b,等於b。循環

  a獲得b原來的值。gc

// 去除了沒有必要的循環
void bubble_sort(int *a,int n)
{
    int flag = 1; // 控制外部循環的
    int k = n; // 外部循環的次數,開始等於數組的總數
    while(flag)
    {
        flag = 0; // 等於外部零循環結束
        for(int i=1;i<k;i++)
        {
            if(a[i-1]>a[i]) // 有與排序衝突的順序
            {
                swap(&a[i-1],&a[i]); // 進行位置調換
                flag = 1; // 檢查到此次循環有位置衝突,繼續進行外部循環檢查
            }
        }
        k--; // 完成了一個數據的位置調換
    }
}
void bubble_sort_other(int *a,int n)
{
    for(int i=0;i<n;i++)
        for(int j = 1;j<n-i;j++)
        {
            if(a[j-1]>a[j])
            {
                a[j-1] = a[j-1]^a[j];
                a[j] = a[j]^a[j-1];
                a[j-1] = a[j-1]^a[j];
            }
        }
}

bubble_sort_other是通常人均可以寫出來的方法

bubble_sort是進行優化了的。

用下試試

int main(int argc, const char * argv[]){
    int a[10]={3,2,4,5,6,7,8,9,24,13};
    bubble_sort(a,10);
    for (int i = 0; i < 10; i++) {
        printf("%d\n",a[i]);
    }
    return 0;
}

結果:

2

3

4

5

6

7

8

9

13

24

相關文章
相關標籤/搜索