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

相关文章
相关标签/搜索