/** 指针指向调换,也是内容调换 */ 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