十大经典排序算法
鸡尾酒排序(Cocktail sort)又称双向冒泡排序,是冒泡排序的一种变形,该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。冒泡排序每次都是从前往后把大的数字放到后面,鸡尾酒排序是先从左往右把大的放到后面,然后再从右往左把小的放到左边……。
private void cocktailSort(int[] nums) {
int length = nums.length;
for (int i = 0; i < length / 2; i++) {
// 从前往后比较,和后面的值进行比较。
for (int j = i; j < length - 1 - i; j++) {
if (nums[j] > nums[j + 1])// 如果前面的比后面的大就交换。
swap(nums, j, j + 1);
}
// 从后往前比较,和前面的值进行比较。
for (int j = length - 1 - (i + 1); j > i; j--) {
if (nums[j - 1] > nums[j])// 如果前面的比后面的大就交换。
swap(nums, j, j - 1);
}
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
或者还可以像下面这样写,可能会更容易理解。
private void cocktailSort(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
// 从前往后比较,和后面的值进行比较。
for (int i = left; i < right; i++)
if (nums[i] > nums[i + 1])// 如果前面的比后面的大就交换。
swap(nums, i, i + 1);
right--;// 放到right位置,下次他就不在参与比较。
// 从后往前比较,和前面的值进行比较。
for (int i = right; i > left; i--)
if (nums[i - 1] > nums[i])// 如果前面的比后面的大就交换。
swap(nums, i, i - 1);
left++;// 放到left位置,下次他就不在参与比较。
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
冒泡排序 ,选择排序 ,插入排序 ,快速排序 ,归并排序 ,堆排序 ,桶排序 ,基数排序 ,希尔排序 ,计数排序 ,位图排序 ,拓扑排序 ,二叉树排序 ,Bogo排序 ,睡眠排序 ,鸡尾酒排序 ,侏儒排序 ,臭皮匠排序 ,图书馆排序 ,珠排序 ,链表排序 ,鸽巢排序 ,奇偶排序 ,慢速排序 ,耐心排序 ,梳排序 ,煎饼排序 ,插值排序 |