冒泡排序(Bubble Sort)
- 最简单写法
//冒泡排序:与后面比较,大于则交换(冒泡)
void BubbleSort_1(int a[], int size)
{
for (int i = 0; i < size; i++)
{
for (int j = i+1; j < size ; j++)
{
if (a[i] > a[j])
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
冒泡排序改进
- 优化:从尾部开始向前移动
好处在于:排序时候从后边开始,将较小者往前边移动。这样较小者会不断往前移动。解决了第一种写法,可能将较小者移到后边的情况,提高了算法效率。在上十万条数据的排序过程中,这种差异将会体现出来。
//优化3:优化从尾部开始向前移动
void BubbleSort_3_1(int a[], int size)
{
for (int i = 0; i < size -1; i++)
{
for (int j = size - 1; j > i ; j--)
{
if (a[j-1] > a[j])
{
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
}
- 优化:添加标记,标记每趟是否交换了数值,没有说明排序完成,提前结束
//优化1:标记每趟是否交换了数值,没有说明排序完成,提前结束
void BubbleSort_3_2(int a[], int size)
{
int bSwaped = 1;
for (int i = 0; i < size -1; i++)
{
// 每次先重置为false
bSwaped = 0;
for (int j = size - 1; j > i ; j--)
{
if (a[j-1] > a[j])
{
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
bSwaped = 1;
}
}
// 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环
if (!bSwaped)
break;
}
}
*优化:记录上次扫描最好一次交换的位置,确定无序区间
思路:
在第一步优化的基础上发进一步思考:如果R[0..i]已是有序区间,上次的扫描区间是R[i..n],记上次扫描时最后一次执行交换的位置为lastSwapPos,则lastSwapPos在i与n之间,不难发现R[i..lastSwapPos]区间也是有序的,否则这个区间也会发生交换;所以下次扫描区间就可以由R[i..n] 缩减到[lastSwapPos..n]。
void BubbleSort_3_3(int a[], int size)
{
int lastSwapPos = 0,lastSwapPosTemp = 0;
for (int i = 0; i < size - 1; i++)
{
lastSwapPos = lastSwapPosTemp;
for (int j = size - 1; j >lastSwapPos; j--)
{
if (a[j - 1] > a[j])
{
int temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
lastSwapPosTemp = j;
}
}
if (lastSwapPos == lastSwapPosTemp)
break;
}
}
and so on
网友评论