冒泡排序的改进
Posted 机房日子青少年编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序的改进相关的知识,希望对你有一定的参考价值。
冒泡排序的基本思想就是依次比较相邻两个元素,不符合排序结果要求的元素就交换。
基本冒泡程序:
void bubblesort(int arr[], int length)
{
for (int i = 0; i < length - 1; i++)
for (int j = 0; j < length - i - 1; j++)
if (arr[j] > arr[j + 1])
Swap(arr[j], arr[j + 1]);
}
如果在冒泡排序的基础上加上一个交换标志,如果在本次循环中没有发生过交换(所有的元素都有序),则不用进行下一次循环,结束排序。
最好情况时间复杂度为O(n),最坏和平均情况时间复杂度为O(n^2)。
改进一:
void bubblesort1(int arr[], int length)
{
bool f= 0;
for (int i = 0; i < length - 1 && !f; i++)
{
f= 1;
for (int j = 0; j < length - i - 1; j++)
if (arr[j] > arr[j + 1])
{
swap(arr[j], arr[j + 1]);
f= 0;
}
}
}
如果在改进方法一的的基础上再次进行改进,每次循环记录最后一次发生交换的元素的位置,这说明这之后的元素已经有序,下一次循环不用比较这些元素。
改进二:
void bubblesort2(int arr[], int length)
{
int cur, j, last = length - 1;
while (last > 0)
{
for (j = cur = 0; j < last; j++)
if (arr[j] > arr[j + 1])
{
swap(arr[j], arr[j + 1]);
cur = j;
}
last = cur;
}
}
在改进二的基础上继续改进,每次循环不仅从前向后扫描记录最后一次发生交换的元素的位置up,而且从后向前扫描记录再次扫描记录最前面发生交换的元素的位置low,这样两侧的元素已经有序,当low>=up的时候证明整个数组有序。
时间复杂度和方法3一样,最好情况时间复杂度为O(n),最坏和平均情况时间复杂度为O(n^2)。
改进三:
void bubblesort3(int arr[], int length)
{
int low, up, index;
low = index = 0;
up = length - 1;
while (up > low)
{
for (int i = low; i < up; i++)
if (arr[i] > arr[i + 1])
{
swap(arr[i], arr[i + 1]);
index = i;
}
up = index;
for (int i = up; i > low; i--)
if (arr[i] < arr[i - 1])
{
swap(arr[i], arr[i - 1]);
index = i;
}
low = index;
}
}
以上是关于冒泡排序的改进的主要内容,如果未能解决你的问题,请参考以下文章