冒泡排序:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
1.数组方式的冒泡排序:(如果是有序的[flag=0],就直接跳出循环,进行下一个数字排序)
//数组方式:
#include<stdio.h>
#include<windows.h>
#include<assert.h>
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 <stdio.h>
#include<windows.h>
#include<assert.h>
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;
}
运行后的结果是: