鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进。此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能。
// 两两互换
void swap (int* a, int i, int j)
{int tmp;tmp = a[i];a[i] = a[j];a[j] = tmp;
}// 鸡尾酒法
void tail1 (int* a, int len)
{// 初始化边界int left = 0;int right = len - 1;int i;while (left < right){// 前半轮将最大元素放到最后面for (i = left; i < right; i++){if (a[i] > a[i+1]){swap (a, i, i+1);}}right--; // 右边界左移一位// 后半轮将最小元素放到最前面for (i = right; i > left; i--){if (a[i-1] > a[i]){swap (a, i, i-1);}}left++; // 左边界右移一位}
}
快速排序(Quicksort)是对冒泡排序的一种改进。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
// 两两互换
void swap (int* a, int i, int j)
{int tmp;tmp = a[i];a[i] = a[j];a[j] = tmp;
}// 分区操作,返回基准值的下标
int partition(int *a, int left, int right)
{int pivot = a[right];int index = left; // 如果找到一个比基准值小的元素,与下标为index的元素交换int i;for (i = left; i < right; i++){if (a[i] < pivot){swap (a, i, index);index++;}}swap (a, index, right);return index; // 基准值所在位置下标
}void qSort(int *a, int left, int right)
{if (left < right){int pivot = partition(a, left, right); // 进行分区操作,找基准值下标qSort (a, left, pivot-1); // 对左边部分进行快速排序qSort (a, pivot+1, right); // 对右边部分进行快速排序 }
}