冒泡排序:(时间复杂度O(N^2))
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序要控制的是最后终止的位置
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
缺点:不管是否有序都要冒一遍找最大的数
优化:如果冒泡过程中没有发生交换,那么这段区间有序(bool exchange)
代码:
Sort.h
#pragma once
void BubbleSort(int* a, size_t n)
{
assert(a);
for (size_t end = n; end > 0;--end)
{
bool exchange = false;
size_t first = 0, second = 1;
while (second < end)
{
if (a[first] > a[second])//如果大的往后冒
{
swap(a[first], a[second]);
exchange = true;//如果发生交换,置成true
}
++first;
++second;
}
if (exchange == false)//如果没有发生交换,则是有序
{
break;
}
}
}
void TestBubbleSort()
{
int a[] = { 2, 5, 4, 9, 3, 6, 8, 7, 1, 0 };
BubbleSort(a, sizeof(a) / sizeof(a[0]));
PrintArray(a, sizeof(a) / sizeof(a[0]));
}
Test.cpp
#include<iostream>
#include<assert.h>
using namespace std;
#include"Sort.h"
int main()
{
TestBubbleSort();
system("pause");
return 0;
}