鸡尾酒排序算法详解
一、什么是雞尾酒排序
1.概念
雞尾酒排序算法又叫快樂小時排序,它基于冒泡排序算法做了一些優(yōu)化。冒泡排序算法每一輪都是從左到右進(jìn)行元素比較,進(jìn)行單向的位置交換,雞尾酒排序算法則是雙向的元素比較和交換。
2.算法原理
這是一個無序數(shù)列:2、3、4、5、6、7、8、1,我們要將它按從小到大排序。按照冒泡排序算法的思想,每一輪將最大的元素移到最右邊。
第一輪結(jié)果
第二輪結(jié)果
第三輪結(jié)果
第四輪結(jié)果
第五輪結(jié)果
第六輪結(jié)果
第七輪結(jié)果
可以看到該序列2到8已經(jīng)是有序的,但還需進(jìn)行7輪排序,而雞尾酒算法可以很好地解決這一問題
雞尾酒排序算法第一輪與冒泡排序一致,從左到右進(jìn)行比較、交換
第二輪,則從右向左進(jìn)行比較、交換
8已經(jīng)是有序了,7和1比較,7大于1,7和1交換
接下來,6和1比較,6大于1,6和1交換
以此類推,第二輪交換結(jié)果如下所示
第三輪,從左到右進(jìn)行比較,2和3比較,位置不變,3和4比較,位置不變,4和5比較,位置不變,5和6比較,位置不變,6和7比較,位置不變
第三輪,沒有發(fā)生任何元素交換,說明序列已是有序的,排序結(jié)束。
3.算法實現(xiàn)
// 雞尾酒排序算法 function sort(arr) {let length = arr.length;// 記錄右側(cè)最后一次交換位置let lastRightExchangeIndex = 0;// 記錄左側(cè)最后一次交換位置let lastLeftExchangeIndex = 0;// 無序數(shù)列的右邊界,每次比較只需要比到這里為止let rightSortBorder = length - 1;// 無序數(shù)列的左邊界,每次比較只需要比到這里為止let leftSortBorder = 0;for (let i = 0; i < length / 2; i++) {let isSorted = true;for (let j = i; j < rightSortBorder; j++) {if (arr[j] > arr[j + 1]) {[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];isSorted = false;lastRightExchangeIndex = j;}}rightSortBorder = lastRightExchangeIndex;if (isSorted) {break;}for (let j = length - i - 1; j > leftSortBorder; j--) {if (arr[j - 1] > arr[j]) {[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];isSorted = false;lastLeftExchangeIndex = j;}}leftSortBorder = lastLeftExchangeIndex;if (isSorted) {break;}} }let arr = [2, 3, 4, 5, 6, 7, 8, 1]; sort(arr); console.log(arr);雞尾酒排序算法與冒泡排序算法一樣,可以通過記錄序列是否已經(jīng)有序和最后一次交換順序進(jìn)行優(yōu)化,代碼中是已優(yōu)化后的算法,具體優(yōu)化原理可以參考十大經(jīng)典排序算法-冒泡排序算法詳解
二、雞尾酒排序算法特點
1.復(fù)雜度和穩(wěn)定性
雞尾酒排序算法是對冒泡排序算法的優(yōu)化,它的復(fù)雜度和穩(wěn)定性和冒泡排序算法是一致的,時間復(fù)雜度為O(N^2),空間復(fù)雜度為O(1),是穩(wěn)定排序算法。
2.優(yōu)點
在特定條件下,通常指大部分元素都有序的場景下,可以減少排序的輪數(shù)。
總結(jié)
- 上一篇: [Maven实战-许晓斌]-[第二章]-
- 下一篇: 什么是服务器的防火墙?防火墙又是如何工作