雞尾酒排序,也叫定向冒泡排序,是冒泡排序的一種改進。此算法與冒泡排序的不同處在于從低到高然后從高到低,而冒泡排序則僅從低到高去比較序列里的每個元素。他可以得到比冒泡排序稍微好一點的效能。
// 兩兩互換
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); // 對右邊部分進行快速排序 }
}