思路:
有n个元素,需要冒n-1次泡,就如有两个元素,只需冒一次泡就可以比较出大小,而且每冒一次泡就能找到一个最大值
每轮冒泡少一个元素
每次冒泡,两两交换,大数往后放(假设是升序排列)
数组冒泡:
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
void bubble_sort(int arr[], int len)
{
assert(arr); //判断数组arr不为空
int i = 0;
for (; i < len - 1; i++) //i控制外循坏,代表冒多少次泡
{
int j = 0;
int flag = 0; // 判断数组是否已经有序
for (; j<len - 1 - i; j++)//j控制内循坏,表示每次冒泡需比较多少个元素,减i是因为每次冒泡少一个元素
{
if (arr[j]>arr[j + 1])
{
arr[j] ^= arr[j + 1];
arr[j + 1] ^= arr[j];
arr[j] ^= arr[j + 1];
flag = 1;
}
}
if (flag == 0)//说明未经过if判断,已经是有序的
{
break;
}
}
}
int main()
{
int arr[] = { 1, 48, 25, 6, 56, 30, 9, 17, 32, 52, 12 };
int len = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, len);
int i;
for (i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}
指针冒泡:
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
void bubble_sort(int arr[], int len)
{
assert(arr);
int *start = arr;
int *end = arr + len - 1;
while (end > arr)
{
int flag = 0;
for (start = arr; start < end; start++)
{
if (*start > *(start + 1))
{
flag = 1;
*start ^= *(start + 1);//start最大是end-1,即倒数第二个元素,所以start+1是可以的
*(start + 1) ^= *start;
*start ^= *(start + 1);
}
}
if (flag == 0)
{
break;
}
end--;
}
}