鸡尾酒排序
鸡尾酒排序实际上是一种双向的冒泡排序。第一趟,从0开始到size-1前往后做“冒泡”,将最大值移动到最后(下标为size-1)。第二趟,从size-2开始到0从后往前做“冒泡”,将最小值移动到最前面(下标为0)。第三趟,从1开始到size-2从前往后做“冒泡”,将最大值移动到最后(下标为size-2)。第四趟,从size-3开始到1从后往前做“冒泡”,将最小值移动到最前面(下标为1)。按照这样的顺序依次执行,到排序过程中没有进行交换操作为止。
例如对序列{8, 3, 6, 1, 9, 5, 4}做鸡尾酒排序。第一趟从前往后,结果为{3, 6, 1, 8, 5, 4, 9}。第二趟从后往前,结果为{1, 3, 6, 4, 8, 5, 9}。第四趟从前往后,结果为{1, 3, 4, 6, 5, 8, 9}。第五趟从后往前,结果为{1, 3, 4, 5, 6, 8, 9}。第六趟从前往后,由于没有进行交换操作,所以排序完毕。最终结果为{1, 3, 4, 5, 6, 8, 9}
#define TRUE 1
#define FALSE 0
typedef int datatype;
typedef int BOOL;
BOOL CocktailSort(datatype *array, int size)
{
int i, j;
int tag;
if(array == NULL) {
return FALSE;
}
//开始排序
for(i = 0; i <= size / 2; i++) {
tag = TRUE;
//从前往后,选出最大值放在这一趟的最后
for(j = i; j < size-i-1; j++) {
if(array[j] > array[j+1]) {
Swap(array+j, array+j+1);
tag = FALSE;
}
}
if(tag) {
return TRUE;
}
//从后往前,选出最小值放在这一趟的最前面
for(j = j-1; j > i; j--) {
if(array[j] < array[j-1]) {
Swap(array+j, array+j-1);
tag = FALSE;
}
}
if(tag) {
return TRUE;
}
}
return TRUE;
}