雞尾酒排序

雞尾酒排序

@(F1 - 算法學習)[排序|noteton]

WIKI上的定義

雞尾酒排序,也就是定向冒泡排序、雞尾酒攪拌排序红氯、攪拌排序(也可以視作選擇排序的一種排序)框咙、漣漪排序、來回排序或者快樂小時排序痢甘,是冒泡排序的一種變形喇嘱。與冒泡排序的不同處在于排序時是以雙向在序列中進行排序。

Sorting_shaker_sort_anim.gif

分類 排序算法
數(shù)據(jù)結(jié)構 數(shù)組
最差時間復雜度
最優(yōu)時間復雜度
平均時間復雜度

與冒泡排序不同的地方

雞尾酒排序等于是冒泡排序的輕微變形塞栅。不同的地方在于從低到高然后從高到低(有先后順序婉称,并非同時;大循環(huán)下第一個循環(huán)是從開始掃到結(jié)束构蹬,將最大的歸到最后王暗;第二個循環(huán)是從倒數(shù)第二個位置往開始端掃,將最小的歸到開始的位置)庄敛,而冒泡排序則僅僅從低到高去比較序列里的每個元素俗壹。他可以得到比冒泡排序稍微好一點的效能,原因是冒泡排序只從一個方向進行比對(由低到高)藻烤,每次只移動一個項目和绷雏。
  以排序(2,3,4,5,1)為例,雞尾酒排序只要訪問一次序列就可以完成排序怖亭,但如果使用冒泡排序需要四次涎显。但是在亂數(shù)序列的狀態(tài)下,雞尾酒排序和冒泡排序的效率都很差兴猩。

偽代碼

function cocktail_sort(list, list_length){ // the first element of list has index 0
    bottom = 0;
    top = list_length - 1;
    swapped = true; 
    while(swapped == true) // if no elements have been swapped, then the list is sorted
    {
        swapped = false; 
        for(i = bottom; i < top; i = i + 1)
        {
            if(list[i] > list[i + 1])  // test whether the two elements are in the correct order
            {
                swap(list[i], list[i + 1]); // let the two elements change places
                swapped = true;
            }
        }
        // decreases top the because the element with the largest value in the unsorted
        // part of the list is now on the position top 
        top = top - 1; 
        for(i = top; i > bottom; i = i - 1)
        {
            if(list[i] < list[i - 1]) 
            {
                swap(list[i], list[i - 1]);
                swapped = true;
            }
        }
        // increases bottom because the element with the smallest value in the unsorted 
        // part of the list is now on the position bottom 
        bottom = bottom + 1;  
    }
}

Java實現(xiàn)

/**
     * 雞尾酒排序法
     * 
     * @param a
     *            指定整型數(shù)組
     */
    public void sort(int[] a) {
        //需要來回a,length/2趟
        for (int i = 0; i < a.length / 2; i++) {
            //類冒泡期吓,交換最大值至右端
            for (int j = i; 1 + j < a.length - i; j++)
                if (a[j] > a[1 + j])
                    Arr.swap(a, j, 1 + j);
            //類冒泡,交換最小值至左端
            for (int j = a.length - i - 1; j > i; j--)
                if (a[j - 1] > a[j])
                    Arr.swap(a, j - 1, j);
        }
    }

注意看這里的代碼實現(xiàn)倾芝,沒有了狀態(tài)變量sorted讨勤,最外面的while循環(huán)也被替代成確定length/2趟的for循環(huán),因為循環(huán)內(nèi)有兩個for各分擔餓了一般的工作晨另,所以潭千,大循環(huán)只需要進行一半。這個在代碼的具體實現(xiàn)時看具體情況吧借尿,如果分析不清楚刨晴,就用偽代碼中的設置狀態(tài)變量也未嘗不可。PS路翻,偽代碼要像思維導圖一樣逼著自己先寫著狈癞!

C實現(xiàn)

#include<stdio.h>
#include<stdbool.h>
void swap(int *a ,int *b);
int main()
{
    int a[] = {4,3,1,6,5,7,2,9,8};
    bool sorted = true;
    int length = sizeof(a) / sizeof(a[0]);
    int top = length - 1;
    int bottom = 0;
    int tmp = 0;
    while (sorted)
    {
        sorted = false;
        for (int i = bottom; i < top; i++)
        {
            if (a[i]<a[i - 1])
            {
                swap(&a[i], &a[i - 1]);
                /*
                {
                    tmp=a[i];
                    a[i] = a[i - 1];
                    a[i - 1] = tmp;
                }
                */
                sorted = true;
            }
        }
        top--;
        for ( int i = top; i >bottom; i--)
        {
            if (a[i]>a[i + 1])
            {
                swap(&a[i], &a[i + 1]);
                /*
                {
                    tmp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = tmp;
                }
                */
                sorted = true;
            }
        }
        bottom++;
    }
    for (int i = 0; i < length; i++)
    {
        printf("%d", a[i]);
    }
}

void swap(int *a, int *b)
{
    int tmp = 0;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帚桩,隨后出現(xiàn)的幾起案子亿驾,更是在濱河造成了極大的恐慌嘹黔,老刑警劉巖账嚎,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莫瞬,死亡現(xiàn)場離奇詭異,居然都是意外死亡郭蕉,警方通過查閱死者的電腦和手機疼邀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來召锈,“玉大人旁振,你說我怎么就攤上這事≌撬辏” “怎么了拐袜?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長梢薪。 經(jīng)常有香客問我蹬铺,道長,這世上最難降的妖魔是什么秉撇? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任甜攀,我火速辦了婚禮,結(jié)果婚禮上琐馆,老公的妹妹穿的比我還像新娘规阀。我一直安慰自己,他們只是感情好瘦麸,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布谁撼。 她就那樣靜靜地躺著,像睡著了一般滋饲。 火紅的嫁衣襯著肌膚如雪彤敛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天了赌,我揣著相機與錄音墨榄,去河邊找鬼。 笑死勿她,一個胖子當著我的面吹牛袄秩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逢并,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼之剧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砍聊?” 一聲冷哼從身側(cè)響起背稼,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玻蝌,沒想到半個月后蟹肘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體词疼,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年帘腹,在試婚紗的時候發(fā)現(xiàn)自己被綠了贰盗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡阳欲,死狀恐怖舵盈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情球化,我是刑警寧澤秽晚,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站筒愚,受9級特大地震影響爆惧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锨能,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一扯再、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧址遇,春花似錦熄阻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浸剩,卻和暖如春钾军,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绢要。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工吏恭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人重罪。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓樱哼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剿配。 傳聞我的和親對象是個殘疾皇子搅幅,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 雞尾酒排序算法是一種定向的冒泡排序算法,由于其來回折騰呼胚,因此又叫雞尾酒攪拌排序茄唐、來回排序或者是漣漪排序、快樂小時排...
    半天妖閱讀 853評論 0 1
  • 雞尾酒排序也就是定向冒泡排序雞尾酒攪拌排序, 攪拌排序 (也可以視作[選擇排序的一種變形), 漣漪排序, 來回排序...
    FlyElephant閱讀 280評論 0 0
  • 雞尾酒排序蝇更,也就是定向冒泡排序沪编,雞尾酒攪拌排序呼盆,攪拌排序(也可以視作選擇排序的一種變形),漣漪排序漾抬,來回排序or ...
    ShortLife閱讀 846評論 0 0
  • 這幾天RIO喝多了宿亡,所以看這個排序算法超級親切常遂。它的原理也十分簡單纳令,還記得上一篇的冒泡排序嗎,它的算法是單方向的冒...
    編碼的哲哲閱讀 1,121評論 0 1
  • 雞尾酒排序克胳,也叫定向冒泡排序平绩,是冒泡排序的一種改進。此算法與冒泡排序的不同處在于從低到高然后從高到低漠另,而冒泡排序則...
    北風第一支閱讀 436評論 0 1