Day 8 氣泡排序與選擇排序

2021-08-21 17:53:11 字數 1701 閱讀 4711

1.氣泡排序

第一層迴圈

氣泡排序第一層迴圈的含義為:需要遍歷多次陣列,才能將這個陣列排好序,

第一次遍歷,確定乙個最值。

第二次遍歷,確定第二個最值。

。。。 第

len-1

次遍歷,確定第

len-1

最值。len-1

個最值都確定了,自然整個陣列也就排好序了。

因此,第一層迴圈含義為:需要遍歷len-1次數組,才能將陣列排好序。

第二層迴圈

通常定義為

int j;  j

是乙個與

i相關的變數,第

2層迴圈需要用到第一層的

i的值。

那第二層迴圈要解決的問題是什麼?

不好想的話,我們反過來想,在第二層迴圈時,我們還要對已經排好序的位置進行遍歷嗎?

當然不需要作此無用功,在第二層遍歷中,我們只需對未排好序的那些待排位置進行遍歷即可,而首先,我們必須知道,哪些元素是已經拍過序的,哪些元素是待排序的。

所以,我們第二層迴圈要解決的問題便是:待排序區域的起始和結尾位置。

而要解決這個問題,

首先,第乙個要解決的便是:在進行這個迴圈時,陣列已經排好了幾個值。

其次,第二個要解決的便是:在陣列中,待排序區域的其實和末尾位置分別是什麼。

第乙個要解決的問題與第一層迴圈已經進行了多少次有關。

第二個要解決的問題則與排序時遍歷的方向有關。

#include

int main()

;int len=sizeof(a)/sizeof(int);

int i,j;

for(i=0;i第

len-1

次遍歷,確定第

len-1最值

}for(j=0;j<10;j++)

printf("\n");

}return 0;

}2.選擇排序

選擇排序也是一種簡單直觀的排序演算法。它的工作原理很容易理解:初始時在序列中找到最小(大)元素,放到序列的起始位置作為已排序序列;然後,再從剩餘未排序元素中繼續尋找最小(大)元素,放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

注意選擇排序與氣泡排序的區別:氣泡排序通過依次交換相鄰兩個順序不合法的元素位置,從而將當前最小(大)元素放到合適的位置;而選擇排序每遍歷一次都記住了當前最小(大)元素的位置,最後僅需一次交換操作即可將其放到合適的位置。

#include

int main ()

;int len=sizeof(a)/sizeof(int);

int i,j;

int min;

for(i=0;i

}                                  //放到已排序序列的末尾(即交換),該操作很有可能把穩定性打亂,所以選擇排序是不穩定的排序演算法

if (min != i)

for(j=0;j<10;j++)

printf("\n");

}

重溫演算法Day8 插入排序與氣泡排序

原地排序 空間複雜度是 o 1 的排序演算法。氣泡排序 對相鄰的兩個元素進行比較,是否滿 換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 n 次,就完成了 n 個資料的排序工作。插入排序 往乙個有序的陣列裡插入乙個新的資料,插入到應該在位置,繼續保持陣列有序。陣列中分為已排序的區間和未排序的...

排序 氣泡排序與選擇排序

最近複習大學學過的演算法,這裡做個筆記。排序,我們學過 這裡需要了解什麼是時間複雜度,什麼是空間複雜度。簡單而言,時間複雜度指執行的次數,空間複雜度指消耗的記憶體。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序 如從大到小 首字母從z到a 錯誤就把他們交換過來。走訪元素的工作是重複地...

選擇排序與氣泡排序

今早心血來潮,又想看看氣泡排序.於是乎度娘一番,找到了度娘給我的這篇文章,前面的文字描述還是簡單易懂的,可惜給出的 示範有些文不對題.於是乎又wiki一番.發現上文給出的 形似選擇排序,於是總結如下 我們假設有乙個陣列 624159 對應的索引也就是 0 5,如果我想描述第二個位置,也就是數字2的位...