排序算法总结——冒泡排序与鸡尾酒排序(C++实现)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

排序算法总结——冒泡排序与鸡尾酒排序(C++实现)
1、冒泡排序
冒泡排序(bubble sort),是⼀种基础的交换排序。

基本思想是,把相邻的元素两辆进⾏⽐较,当⼀个元素⼤于右侧相邻元素时,交换它们的位置;当⼀个元素⼩于或等于右侧相邻元素时,位置不变。

冒泡排序是⼀种稳定排序,值相等的元素并不会打乱原本的顺序。

由于该排序算法每⼀轮都要遍历所有元素,总共遍历(元素数量-1)轮,平均时间复杂度为O(n2)。

升级版1:
对于序列的后半部分已经是有序的情况,如果能判断出有序,并作出标记,那么剩下的⼏轮排序就不必执⾏了。

利⽤bool变量isSorted作为标记,如果在本轮排序中,元素有交换,则说明数列⽆序;如果没有元素交换,则说明数列已然有序,直接跳出⼤循环。

升级版2:
界定序列有序区。

在每⼀次排序后,记录下来最后⼀次元素交换的位置,该位置即为⽆序数列的边界,再往后就是有序区了。

class Solution
{
public:
void bubble_sort(int* data, int length)
{
if (data == nullptr || length <= 0)
return;
// ⽆序数列的边界,每次⽐较到这即停⽌
int sortBoard = length - 1;
for (int i = 0; i < length - 1; ++i)
{
//记录最后⼀次交换的位置
int lastExchangeIndex = 0;
// 有序标志,每⼀轮的初始值都是true;
bool isSorted = true;
for (int j = 0; j < sortBoard; ++j)
{
int temp = 0;
if (data[j] > data[j + 1])
{
temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
// 因为有元素进⾏交换,所以不是有序的,标记变为false;
isSorted = false;
// 将⽆序数列的边界更新为最后⼀次交换元素的位置
lastExchangeIndex = j;
}
}
sortBoard = lastExchangeIndex;
if (isSorted)
break;
}
}
};
2、鸡尾酒排序(cocktail sort)
鸡尾酒排序法的元素⽐较和交换过程是双向的。

在⼤部分元素已经有序的情况下,减少排序的次数。

缺点就是代码量较⼤。

时间复杂度也是O(n2)。

class Solution
{
public:
void cocltail_sort(int* data, int length)
{
if (data == nullptr || length <= 0)
return;
int temp = 0;
for (int i = 0; i < length / 2; ++i)
{
// 有序标志,每⼀轮的初始值都为true;
bool isSorted = false;
// 奇数轮,从左向右⽐较和变换
for (int j = i; j < length - i - 1; ++j)
{
if (data[j] > data[j + 1])
{
temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
// 因为有元素交换,所以不是有序的,标记变为false isSorted = false;
}
}
if (isSorted) break;
// 偶数轮,将isSorted重新标记为true;
isSorted = false;
for (int j = length - i - 1; j > i; --j)
{
if (data[j] < data[j - 1])
{
temp = data[j - 1];
data[j - 1] = data[j];
data[j] = temp;
// 因为有元素交换,所以不是有序的,标记变为false isSorted = false;
}
}
if (isSorted) break;
}
}
};
⽤⼀个特殊的测试案例:
void test()
{
int data[] = { 2, 3, 4, 5, 6, 7, 8, 1 };
int length = sizeof(data) / sizeof(int);
Solution M;
M.cocltail_sort(data, length);
for (int i = 0; i < length; ++i)
cout << data[i] << "";
cout << endl;
}。

相关文档
最新文档