冒泡排序的思路:
1. 数据两两比较,将较大的数据挪到后面,这样一次循环后就可以确定一个元素的最终位置。
2. 接着从头开始两两比较,将次大的数据挪到上次已经排序好的数据的前一个位置。
3. 重复size-1次即可将size-1个元素放到它的最终位置上,这样剩下的那个元素肯定在自己的最终位置上,冒泡排序结束。
代码实现:
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//打印
void Print(int *array,int size);
//冒泡排序
void BubbleSort(int *array, int size);
//打印
void Print(int *array, int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
void swap(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
//冒泡排序
void BubbleSort(int *array, int size)
{
int i = 0;
int j = 0;
int k = 1;
int flag = 0;
//外循环循环size-1次、
for (i = 0; i < size - 1; i++)
{
flag = 0;
for (j = 0; j < size - i - 1; j++)
{
if (array[j]>array[j + 1])
{
flag = 1;
swap(&array[j], &array[j + 1]);
}
}
//打印
printf("第%d次排序后:", k++);
Print(array, size);
//flag为0说明没有交换,排序结束
if (flag == 0)
{
break;
}
}
}
测试文件:
#include"sort.h"
void TestBubbleSort()
{
int array[] = { 10, 2, 5, 4, 6, 9, 3, 1, 0 };
printf("排序前:");
//打印
Print(array, sizeof(array) / sizeof(array[0]));
//冒泡排序
BubbleSort(array, sizeof(array) / sizeof(array[0]));
printf("排序后:");
//打印
Print(array, sizeof(array) / sizeof(array[0]));
}
int main()
{
TestBubbleSort();
system("pause");
return 0;
}
为什么要设置一个变量flag?
比如序列【0,2,1】,第一次冒泡排序后,序列变为【0,1,2】序列已有序,就不必在进行第二次排序。所以设置一个变量flag,当元素一次冒泡后没有交换数据,就证明该序列已经有序,直接退出即可。
时间复杂度:
O(n^2)
空间复杂度:
O(1)—(没有借助辅助空间)