1. 程式人生 > >【演算法分析】排序演算法:雞尾酒排序

【演算法分析】排序演算法:雞尾酒排序

        雞尾酒排序演算法是一種定向的冒泡法排序演算法,由於其來回折騰,又叫雞尾酒攪拌排序、來回排序、漣漪排序等。

        演算法原理:陣列中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。

        有點像是兩邊向中間夾逼的感腳,如圖所示:


程式碼如下:

/***********************************
Copyright (c) 2015 Jingshuang Hu  
  
@filename:demo.c 
@datetime:2015.09.25  
@author:HJS  
@e-mail:
[email protected]
@blog:http://blog.csdn.net/hujingshuang ************************************/ #include <stdio.h> #include <stdlib.h> #include <math.h> /***********************************/ #define N 15 /***********************************/ void Cocktail_Show(int *data, int n); void Cocktail_Sort(int *data, int n); /***********************************/ int main() { int i = 0; int data[N] = {0}; srand((unsigned int)NULL); for (i = 0; i < N; i++) { data[i] = rand() % 50 + rand() % 50; } Cocktail_Show(data, N); Cocktail_Sort(data, N); Cocktail_Show(data, N); return 0; } /***********************************/ void Cocktail_Sort(int *data, int n) { int i = 0, max_k = 0, min_k= 0, t = 0, temp = 0; int min = 0, max = 0; int min_pos = 0, max_pos = n - 1; min = max = data[0]; while(t < n / 2)//趟數(這裡一趟指的是一個來回) { t++; for (i = min_pos; i <= max_pos; i++) { if (data[i] > max) { max = data[i];//記錄最大值的值和位置 max_k = i; } } //將末尾數與最大值位置交換(末尾是相對的哈) temp = data[max_pos]; data[max_pos] = data[max_k]; data[max_k] = temp; max_k = --max_pos; max = data[max_pos]; for (i = max_pos; i >= min_pos; i--) { if (data[i] < min) { min = data[i];//記錄最小值的值和位置 min_k = i; } } //將首位數與最小值位置交換(首位也是相對的哈) temp = data[min_pos]; data[min_pos] = data[min_k]; data[min_k] = temp; min_k = ++min_pos; min = data[min_pos]; } } /***********************************/ void Cocktail_Show(int *data, int n) { int i = 0; for (i = 0; i < n - 1; i++) { printf("%d ", data[i]); } printf("%d\n", data[i]); }


相關推薦

演算法分析字串匹配BF、KMP演算法

字串匹配演算法:BF、KMP演算法程式碼。 /***************************************** Copyright (c) 2015 Jingshuang Hu @filename:demo.c @datetime:20

演算法分析排序演算法雞尾酒排序

        雞尾酒排序演算法是一種定向的冒泡法排序演算法,由於其來回折騰,又叫雞尾酒攪拌排序、來回排序、漣漪排序等。         演算法原理:陣列中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第

Go 原始碼分析從 sort.go 看排序演算法的工程實踐

go version go1.11 darwin/amd64file: src/sort/sort.go 排序演算法有很多種類,比如快排、堆排、插入排序等。各種排序演算法各有其優劣性,在實際生產過程中用到的排序演算法(或者說 Sort 函式)通常是由幾種排序演算法組

2演算法進階之秩序井然八大排序

排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排序、堆排序、基數排序等。

scala 資料結構和演算法Scala實現氣泡排序

主要內容: 1、氣泡排序演算法原理 2、scala實現 3、python實現 4、goland實現 氣泡排序演算法原理: 1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 2、對

演算法導論 第七章快速排序 筆記(快速排序的描述、快速排序的效能、快速排序的隨機化版本、快速排序分析

快速排序的最壞情況時間複雜度為Θ(n^2)。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能很好。它的期望執行時間複雜度為Θ(n lg n),而且Θ(n lg n)中蘊含的常數因子非常小,而且它還是原址排序的。 快速排序是一種排序演算法,對包含n個數的

演算法分析Lucas–Kanade光流演算法

作者:[email protected]簡介:在計算機視覺中,Lucas–Kanade光流演算法是一種兩幀差分的光流估計演算法。它由Bruce D. Lucas 和 Takeo Kanade提出。光流的概念:(Optical flow or optic flow)它是一種運動模式,這種運動模式指的是

資料分析演算法+Echarts小練

''' 處理邏輯: 按number去處理 先遍歷所有的number挨個去找有沒有在列表裡的,在列表裡的拿出另外一個append 把number去除的列表 ''' li = [] with open(r'F:\資料分析專用\通話圈分析\new\test1.txt', 'r') as f:

演算法分析如何理解快慢指標?判斷linked list中是否有環、找到環的起始節點位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 為例Python實現

快慢指標簡述 快慢指標經常用於連結串列(linked list)中環(Cycle)相關的問題。 快指標(fast pointer)和慢指標(slow pointer)都從連結串列的head出發。 slow pointer每次移動一格,而快指標每次移動兩格。 如果快慢指標能相遇,則證明連結串列中有環;否則沒有

演算法筆記第二章 C/C++ 快速入門

【演算法筆記】第二章: C/C++ 快速入門 標籤(空格分隔):【演算法筆記】 第二章:C/C++ 快速入門 第二章:C/C++ 快速入門 2.0 引言 2.1 基本資料型別

必須知道的八大種排序演算法java實現(三) 歸併排序演算法、堆排序演算法詳解

一、歸併排序演算法 基本思想:   歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。 歸併排序示例:   合併方法: 設r[i…n]由兩個有序子表r[i…m]和r[m+1…n]組

必須知道的八大種排序演算法java實現(二) 選擇排序,插入排序,希爾演算法詳解

一、選擇排序   1、基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。   2、例項   3、演算法實現    /** * 選擇排序演算法 * 在未

必須知道的八大種排序演算法java實現(一) 氣泡排序、快速排序

氣泡排序   氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。   氣泡排序的示例:   氣

問底伍藝一種基於Rsync演算法的資料庫備份方案設計

根據容災備份系統對備份類別的要求程度,資料庫備份系統可以分為資料級備份和應用級備份。資料備份是指建立一個異地的資料備份系統,該系統是對原本地系統關鍵應用資料實時複製。當出現故障時,可由異地資料系統迅速恢復本地資料從而保證業務的連續性。應用級備份比資料備份層次更高,即在異地建

資料結構Java實現各類經典排序演算法——插入排序、希爾排序

一、插入排序    顧名思義,插入排序從左往右掃描陣列,每趟排序把一個元素“插入”到已排序部分陣列的合適位置中。既然是“插入”,則不必兩兩交換元素來進行排序,從邏輯上把當前元素放到合適位置,並把該位置右側部分元素往右移動一格就可以了。這樣做和氣泡排序的交換相鄰元素比,好處在於

資料結構與演算法分析筆記與總結(java實現)--排序5快速排序練習題

題目:對於一個int陣列,請編寫一個快速排序演算法,對陣列元素排序。給定一個int陣列A及陣列的大小n,請返回排序後的陣列。測試樣例:[1,2,3,5,2,3],6 [1,2,2,3,3,5] 思路: 快速排序是使用二分思想,通過遞迴來實現排序的。對於一個數組,它先隨機選

資料結構與演算法分析1.2 編寫程式解決字謎問題

原博:http://blog.csdn.net/u013667086/article/details/49179741 問題描述:       從已知的字謎中找出在字典中的單詞 解決思路:        1、用指標陣列存放字謎和字典單詞        2、將字典單

演算法分析回溯法解數獨(九宮格)演算法

這篇文章,是來詳細介紹怎樣寫出一個演算法,來解出所有的數獨問題。演算法的程式執行時間,縮減在了毫秒級別。等到這篇文章結束,我會抽時間寫一篇文章,介紹如何生成一個隨機的唯一解的數獨問題。 另外,為了做圖形方便,示範程式碼是用C++,喜歡其他語言的朋

演算法分析回溯法解八皇后問題(n皇后問題)

回溯法解題思路: (1)針對所給問題,定義問題的解空間;    (2)確定易於搜尋的解空間結構;    (3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。 八皇后問題:

動態規劃LCS演算法求兩字串最大公共字串(連續)

LCS演算法的應用 問題描述:求兩字串的連續最大公共子字串 思路:根據上文LCS演算法求解兩字串的最大公共子序列(不連續),可以得到求解連續子字串的啟示,如圖所示,構造LCS矩陣vec,將兩個字串按矩