1、程序文件
#include <stdio.h>
// 两两交换
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 鸡尾酒排序
void mySort(int *a, int len)
{
int left = 0;
int right = len-1;
int i;
while (left < right)
{
// right 是数组尾元素的下标
// 从左往右走,找最大元素
for (i = left; i < right; i++)
{
if (a[i] > a[i+1])
{
mySwap(a, i, i+1);
}
}
right--;
// 从右往左走,找最小元素
for (i = right; i > left; i--)
{
if (a[i] < a[i-1])
{
mySwap(a, i, i-1);
}
}
left++;
}
}
// 递归2
void mySort2(int *a, int left, int right)
{
if (left >= right)
{
return;
}
int i;
for (i = left; i < right; i++)
{
if (a[i] > a[i+1])
{
mySwap(a, i, i+1);
}
}
for (i = right - 1; i > left; i--)
{
if (a[i] < a[i-1])
{
mySwap(a, i, i-1);
}
}
mySort2(a, left+1, right-1);
}
// 递归1
void mySort1(int *a, int left, int right)
{
if (left >= right)
{
return;
}
int i;
// 从左往右走,找最大元素
for (i = left; i < right; i++)
{
if (a[i] > a[i+1])
{
mySwap(a, i, i+1);
}
}
right--;
// 从右往左走,找最小元素
for (i = right; i > left; i--)
{
if (a[i] < a[i-1])
{
mySwap(a, i, i-1);
}
}
left++;
mySort1(a, left, right);
}
// 打印
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// 主函数
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int len;
len = sizeof(a)/sizeof(a[0]);
// mySort(a, len);
// mySort1(a, 0, len-1);
mySort2(a, 0, len-1);
myPrint(a, len);
return 0;
}
2、测试结果
root@lj:/mnt/hgfs/shared-lj# gcc 冒泡排序(鸡尾酒排序).c
root@lj:/mnt/hgfs/shared-lj# ./a.out
0 1 2 3 4 5 6 7 8 9