📅  最后修改于: 2023-12-03 15:12:57.080000             🧑  作者: Mango
鸡尾酒排序是一种冒泡排序的变形,也被称为双向冒泡排序。它的原理是先进行从左到右的冒泡排序,然后再进行从右到左的冒泡排序,以此类推,直到排序完成。
相比于冒泡排序,鸡尾酒排序可以在一定程度上避免大量的无用扫描,因此可以提高排序效率。
以下是鸡尾酒排序的C++程序代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void cocktailSort(vector<int>& arr){
int n = arr.size();
bool swapped = true;
int start = 0;
int end = n - 1;
while (swapped) {
swapped = false;
for (int i = start; i < end; ++i) {
if (arr[i] > arr[i + 1]) {
swap(arr[i], arr[i + 1]);
swapped = true;
}
}
if (!swapped) {
break;
}
swapped = false;
--end;
for (int i = end - 1; i >= start; --i) {
if (arr[i] > arr[i + 1]) {
swap(arr[i], arr[i + 1]);
swapped = true;
}
}
++start;
}
}
int main() {
vector<int> arr = { 64, 34, 25, 12, 22, 11, 90 };
cocktailSort(arr);
cout << "Sorted array: \n";
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}
在这个程序中,我们首先定义了一个函数cocktailSort
,它接收一个整数类型的向量数组作为参数。
函数中,我们首先定义变量n
来存储输入数组的长度,接着定义了一个布尔类型的变量swapped
,用来判断是否已经完成所有排序操作。然后,我们又定义了变量start
和end
,分别表示当前排序的起始位置和终止位置。
在第一个while循环中,我们首先进行了从左到右的冒泡排序,如果在遍历完整个数组后没有发生交换操作,那么说明数组已经全部排序完成,因此可以退出循环。
在第二个while循环中,我们进行了从右到左的冒泡排序,同样,如果在遍历完整个数组后没有发生交换操作,那么说明数组已经全部排序完成,因此可以退出循环。
在函数体的最后,我们调用了函数main
,并在其中定义了一个含有7个元素的向量数组,并对该数组进行鸡尾酒排序。最后,我们输出了排序后的数组。
鸡尾酒排序是一种优秀的排序算法,特别适用于需要排序的元素数量较少的情况。在实际的开发过程中,我们可以根据需要将它应用到数组、链表、文件等不同的数据结构中,以获得更优秀的排序效果。同时,我们也可以通过多种方式优化该算法,如减少冒泡排序的循环次数、采用双向链表等,都可以在一定程度上提升该算法的排序效率。