/** 指針指向調換,也是內容調換 */ 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