鸡尾酒排序:
鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种变型。
鸡尾酒排序的思想:
鸡尾酒排序首先从序列的左侧两两比较相邻元素的大小,若前面比后面大则交换两者顺序,否则不交换,当进行一次遍历之后,序列的最后一个元素为最大值,然后从序列的右侧出发(排除了最后一个元素)两两比较相邻元素的大小,若前面比后面大则交换两者顺序,否则不交换,当进行一次遍历之后,序列的最前面一个元素为序列的最小值,一直进行下去,直至序列有序。
举例说明:
比如对于{3,7,1,5,2}序列:
第一次:{3,1,5,2,7};
第二次:{1,3,5,2,7};
第三次:{1,3,2,5,7};
第四次:{1,2,3,5,7};
代码实现:
#include<iostream>
using namespace std;
void ShowArr(int arr[], int length);
void CocktailSort(int arr[], int length);
void Swap(int arr[], int i, int j);
int main()
{
int arr[] = { 9,2,3,3,9,7,5,1,9,2,10 };
int length = sizeof(arr) / sizeof(int);
ShowArr(arr, length);
CocktailSort(arr, length);
ShowArr(arr, length);
system("pause");
return 0;
}
void ShowArr(int arr[], int length)
{
for (int i = 0; i < length; i++)
{
cout << arr[i] << "\t";
}
cout << endl;
}
void CocktailSort(int arr[], int length)
{
if (arr == nullptr || length <= 0)
return;
int left = 0;
int right = length - 1;
while (left < right)
{
for (int i = left; i < right; i++)
{
if (arr[i] > arr[i + 1])
Swap(arr, i, i + 1);
}
right--;
for (int j = right; j > left; j--)
{
if (arr[j-1] > arr[j])
Swap(arr, j-1, j);
}
left++;
}
}
void Swap(int arr[], int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
时间复杂度分析:
while第一次循环为
n−1+n−2
n
−
1
+
n
−
2
,第二次循环为
n−3+n−4
n
−
3
+
n
−
4
,一直进行下去,最后一次为
2+1
2
+
1
,所以时间复杂度为
n−1+n−2+...+2+1=n(n−1)2
n
−
1
+
n
−
2
+
.
.
.
+
2
+
1
=
n
(
n
−
1
)
2
,即
O(n2)
O
(
n
2
)
.