Ⅰ 冒泡排序
冒泡排序的英文Bubble Sort,是一種最基礎衫神的交換排序。之所以叫做冒泡排序,因為每一個元素都可以像小氣泡一樣,根據自身大小一點一點向數組的一側移動。
冒泡排序是一種簡單的排序演算法,它也是一種穩定排序演算法。其實現原理是重復掃描待排序序列,並比較每一對相鄰的元素,當該對元素順序不正確時孫塌拆進行交換。一直重復這個過程,直到沒有任何兩個相鄰元素可以交換,就表明完成了排序。
一般情況下,稱某個排序演算法穩定,指的是當待排序序列中有相同的元素時,它們的相對位置在排序前後不會發生改變。
請點擊輸入圖片描述(最多18字)
泡排序的原理:
每一趟只能確定將一個數歸位則棗。即第一趟只能確定將末位上的數歸位,第二趟只能將倒數第2位上的數歸位,依次類推下去。如果有n個數進行排序,只需將n-1個數歸位,也就是要進行n-1趟操作。
而「每一趟」都需要從第一位開始進行相鄰的兩個數的比較,將較大的數放後面,比較完畢之後向後挪一位繼續比較下面兩個相鄰的兩個數大小關系,重復此步驟,直到最後一個還沒歸位的數。
Ⅱ 演算法- 冒泡排序(Bubble Sort)
冒泡排序是一種計算機科學領域的較簡單的排序演算法。
從後向前,比較相鄰的元素,如果第一個比第二個大,就交換他們兩個。比較每一對相鄰元素,到隊尾最後一個元素應該會是最大的數。依次類推,比出第二大的數,直至所有元素都成倒敘排列(9,8,7,6,5,4,3,2,1,0)
這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端,故名。
時間復雜度
若文件本身的排列和想要的排列一致,一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值。
原排序(9,8,7,6,5,4,3,2,1,0) ➡ 需要排序(9,8,7,6,5,4,3,2,1,0)
[圖片上叢清鍵傳失敗...(image-b8e712-1571212381789)]
若文件本身的排列和想要的排列相反,需要進行n-1趟排序,每趟排序要進行n-i次關鍵字的比較。
比如 原排序(1,2,3,4,5) ➡ 需要排序(5,4,3,2,1)
n = 5, 1 <= i <5 ; 排列次數 1+2+3+...+(n-1) = n*(n-1)/2 ;
每次比較都必須移動正返記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
[圖片上傳失敗...(image-36e71a-1571212381789)]
[圖片上傳失敗...(image-fc1c25-1571212381789)]
冒泡排序的最壞滲巧時間復雜度為 [圖片上傳失敗...(image-10a015-1571212381789)]
。
冒泡排序總的平均時間復雜度為 [圖片上傳失敗...(image-1272a9-1571212381789)]
。
演算法描述
C語言
void bubble_sort(int a[] , int n)
{
}
OC語言
NSMutableArray * arr = [NSMutableArray arrayWithObjects:@"5",@"4",@"3",@"2",@"1", nil];
for (int j = 0; j < arr.count - 1; j++) {
}
NSLog(@"%@",arr);
時間復雜度
演算法的時間復雜度是一個函數,它定量描述了該演算法的運行時間。這是一個關於代表演算法輸入值的字元串的長度的函數。時間復雜度常用於大O符號表示,不包括這個函數的低階項和首項系數。O(n)即時間復雜度為n。
Ⅲ 冒泡排序演算法
從小到大的排序
class Program
{
public static void Sort(int[] myArray)
{
// 取長度最長的片語 -- 冒泡法
for (int j = 1; j < myArray.Length;j++)
{
for (int i = 0; i < myArray.Length - 1; i++)
{
// 如果 myArray[i] > myArray[i+1] ,則 myArray[i] 上浮一位
if (myArray[i] >myArray[i + 1])
{
int temp = myArray[i];
myArray[i] = myArray[i + 1];
myArray[i + 1] = temp;
}
}
}
}
static void Main(string[] args)
{
int[] myArray = new int[] { 10, 8, 3, 5, 6, 7, 4, 6, 9 };
Sort(myArray);
for (int m = 0; m < myArray.Length; m++)
{
Console.WriteLine(myArray[m]);
}
}
從大到小的排序
class Program
{
public static void Sort(int[] myArray)
{
// 取長度最長的片語 -- 冒泡法
for (int j = 1; j < myArray.Length;j++)
{
for (int i = 0; i < myArray.Length - 1; i++)
{
// 如果 myArray[i] < myArray[i+1] ,則 myArray[i] 下沉一位
if (myArray[i] < myArray[i + 1])
{
int temp = myArray[i];
myArray[i] = myArray[i + 1];
myArray[i + 1] = temp;
}
}
}
}
static void Main(string[] args)
{
int[] myArray = new int[] { 10, 8, 3, 5, 6, 7, 4, 6, 9 };
Sort(myArray);
for (int m = 0; m < myArray.Length; m++)
{
Console.WriteLine(myArray[m]);
}
}
Ⅳ 冒泡排序的演算法原理
冒泡排序演算法的運作如下:(從後往前) 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 針對所有的元素重復以上的步驟,除了最後一個。 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
Ⅳ 請編程實現一個冒泡排序演算法
演算法思想簡單描述:
在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上
而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較
小的往上冒。即:每當兩相鄰的數比較後發現它們的侍隱排序與排序要
求相反時,就將它們互換。
下面是一種改進的冒泡演算法,它記錄了每一遍掃描後最後下沉數的
位置k,這樣可以減少外察帶層循環掃描的次數。
冒泡排序是穩定的。演算法時間復雜度O(n^2)
演算法實現:
/*
功能:冒泡排序
輸入:數組名稱(也就老沒廳是數組首地址)、數組中元素個數
*/
void bubble_sort(int *x, int n)
{
int j, k, h, t;
for (h=n-1; h>0; h=k) /*循環到沒有比較范圍*/
{
for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描後更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在後面,小的放到前面*/
{
t = *(x+j);
*(x+j) = *(x+j+1);
*(x+j+1) = t; /*完成交換*/
k = j; /*保存最後下沉的位置。這樣k後面的都是排序排好了的。*/
}
}
}
}
Ⅵ 用flash做冒泡排序演算法
我收藏了一個,你給我一個郵箱吧
Ⅶ c語言冒泡排序法流程圖
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序演算法是《數據歷唯乎結構與演算法》中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸並排序、快速排序、堆排序、基數排序等。以下是冒泡排序演算法:
冒泡排序(Bubble Sort)也是一種簡單直觀的排序演算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數列的頂端。
作為最簡單的排序演算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書里出現的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優化演算法,就是立肢悉一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。但這種改進對於提升性能來
說並沒有山攜什麼太大作用。 1. 演算法步驟
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
針對所有的元素重復以上的步驟,除了最後一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
2. 動圖演示
3. 什麼時候最快
當輸入的數據已經是正序時(都已經是正序了,我還要你冒泡排序有何用啊)。
4. 什麼時候最慢
當輸入的數據是反序時(寫一個 for 循環反序輸出數據不就行了,幹嘛要用你冒泡排序呢,我是閑的嗎)。 5. JavaScript 代碼實現 實例 function bubbleSort ( arr ) {
var len = arr. length ;
for ( var i = 0 ; i arr [ j+ 1 ] :
arr [ j ] , arr [ j + 1 ] = arr [ j + 1 ] , arr [ j ]
return arr
7. Go 代碼實現 實例 func bubbleSort ( arr [] int ) [] int {
length := len ( arr )
for i := 0 ; i < length ; i ++ {
for j := 0 ; j < length - 1 - i ; j ++ {
if arr [ j ] > arr [ j + 1 ] {
arr [ j ], arr [ j + 1 ] = arr [ j + 1 ], arr [ j ]
}
}
}
return arr
}
8. Java 代碼實現 實例 public class BubbleSort implements IArraySort {
@Override
public int [ ] sort ( int [ ] sourceArray ) throws Exception {
// 對 arr 進行拷貝,不改變參數內容
int [ ] arr = Arrays . Of ( sourceArray, sourceArray. length ) ;
for ( int i = 1 ; i
Ⅷ C#中冒泡排序的演算法思想
交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。
冒泡排序
1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R[i]看作是重量為R[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。
(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。
(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最後,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到棚州頂部位置R[i]上,結果是R[1..i]變為新的有序區。
2、冒泡排序過程示例
對關鍵字序列為49 38 65 97 76 13 27 49的文件進行冒泡排序的過程【參見動畫演示】
3、排序演算法
(1)分析
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。
若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。神陸為此,在下面給出的演算法中,引入一個布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發生了交換,則將其置為TRUE。各趟排序結束時檢查exchange,若未曾發生過交換則終止演算法,不再進行下一鏈瞎蔽趟排序。
(2)具體演算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,採用自下向上掃描,對R做冒泡排序
int i,j;
Boolean exchange; //交換標志
for(i=1;i<n;i++){ //最多做n-1趟排序
exchange=FALSE; //本趟排序開始前,交換標志應為假
for(j=n-1;j>=i;j--) //對當前無序區R[i..n]自下向上掃描
if(R[j+1].key<R[j].key){//交換記錄
R[0]=R[j+1]; //R[0]不是哨兵,僅做暫存單元
R[j+1]=R[j];
R[j]=R[0];
exchange=TRUE; //發生了交換,故將交換標志置為真
}
if(!exchange) //本趟排序未發生交換,提前終止演算法
return;
} //endfor(外循環)
} //BubbleSort