冒泡排序思想
将待排序数据序列的相邻两个数据(0,1 1,2 2,3 3,4 。。。 n-2, n-1)进行比较,然后将大的数据向后交换。一趟比较之后,就可以将最大的数据交换到最后。接下来,在对剩余的数据(除过最后一个数据)在进行冒泡排序。经过n-1次后,整个数据序列就有序了。
例:有这样一个无序数组。将下标0和1的两个数字比较,如果前面比后面大则将两个数字交换,随后继续比较下标1和2两个数字。
81 与 79 相比 81 大,则将 81 放在 下标2 ,79放在 下标1.
经过一次从0and1比较一直到8and9比较后
尽管现在数组依然无序,但是我们将数组中最大的元素99放在了下标9。
这样通过不断的0and1比较再到7and8比较又将第二大的元素放在了下标8。
0and1比较到6and7–5and6–4and5–3and4–2and3–1and2
这个时候除了下标0and1剩下都已经有序
继而在最后比较0and1总共比较 9次!
冒泡算法
时间复杂度: 等差数列 O(n^2)
空间复杂度: O(1)
稳定性: 稳定的
排序算法的实现
#include<stdio.h>
#include<stdlib.h>
#include<cstdlib>
#include<cstdio>
#include<ctime>
void Show(int* arr, int len)
{
for (int i = 0; i < len; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void Swap(int* a, int* b)
{
int c = *a;
*a = *b;
*b = c;
}
void IsSort(int* arr, int len)
{
for (int i = 0; i < len - 1; ++i)
{
if (arr[i] > arr[i + 1])
{
printf("无序\n");
return;
}
}
printf("有序\n");
}
void BubbleSort(int* arr, int len)
{
for (int i = 0; i < len-1; i++)
{
int flag = 1;
for (int j = 0; j < len - i-1; j++)
{
if (arr[j] > arr[j + 1])
{
Swap(&arr[j], &arr[j + 1]);
flag = 0;
}
}
if (flag) return;
/*flag的定义是很巧妙的一个方法来优化速率,
即数组已经有序而循环还未结束,
通过flag可以发现某次循环并没有进行数字交换,
则退出循环排序结束。*/
}
}
int main()
{
int arr[10];
int i;
srand((unsigned int)time(0));
for (i = 0; i <= 9; i++)
{
arr[i] = rand() % 100;
}
Show(arr,10);
BubbleSort(arr, 10);
IsSort(arr,10);
Show(arr,10);
return 0;
}
在第一个for里,之所以 i <len -1; 如上面所讲,我们进行9次循环来将数组无序最大数放在正确的位置,所以是 len - 1 。
所以第二个for 为 j < len -i - 1 就很明了了。