本文共 1821 字,大约阅读时间需要 6 分钟。
冒泡排序:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。1.数组方式的冒泡排序:(如果是有序的[flag=0],就直接跳出循环,进行下一个数字排序)
//数组方式:#include#include #include void bubble(int *arr, int size){ assert(arr); assert(size > 0); int i = 0; int j = 0; int flag = 0; //第一个与后面的一次比较,如果大于后面的数,则交换位置;然后把后面的数依次比较,直到第size-2个; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - 1 - i; j++) { flag = 1; if (arr[j]>arr[j + 1]) { arr[j] ^= arr[j + 1]; arr[j + 1] ^= arr[j]; arr[j] ^= arr[j + 1]; } } if (0 == flag) { break; } }}void print(int *arr, int size){ int i = 0; for (i = 0; i < size; i++) { printf("%d ", arr[i]); }}int main(){ int arr[] = { 12, 24, 45, 53, 67, 64, 86, 78, 95, 73 }; int size = sizeof(arr) / sizeof(arr[0]); printf("排序前: "); print(arr, size); printf("\n"); bubble(arr, size); printf("排序后: "); print(arr, size); system("pause"); return 0;}
2.指针方式:
//指针方式:#include#include #include void print(int *arr, int size){ int i = 0; for (i = 0; i < size; i++) { printf("%d ", arr[i]); }}void bubble(int *arr, int size){ assert(arr); assert(size > 0); int i = 0; int flag = 0; int *start = arr; int *end = arr + size - 1; while (end>arr)//至少有两个数比较; { for (start = arr; start < end; start++) { if ((*start)>*(start + 1)) { flag = 1; *start ^= *(start + 1); *(start + 1) ^= *start; *start ^= *(start + 1); } } if (0 == flag) { break; } end--; }}int main(){ int arr[] = { 12, 24, 45, 53, 67, 64, 86, 78, 95, 73 }; int size = sizeof(arr) / sizeof(arr[0]); printf("排序前: "); print(arr, size); printf("\n"); bubble(arr, size); //int ret=bubble(arr, size); //printf("%d\n", ret); printf("排序后: "); print(arr, size); system("pause"); return 0;}
运行后的结果是: