常見簡單排序演算法(選擇,冒泡,插入)

2021-07-11 07:34:35 字數 2366 閱讀 8589

原理

每一次從待排序的資料元素中選出最大(小)的,將其放在前面已排好序的資料後面,然後又從剩下的資料中選出最大(小)的,重複操作,以此類推。

c**

#include

void main()

; int i, j,k, temp;

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

}temp = a[i];//找到了就開始交換位置

a[i] = a[k];

a[k] = temp;

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

}

詳解

第一輪比較,從第乙個元素7開始,即i=0時,j=1, j從第i個元素的後乙個元素開始遍歷,用7與其他元素比較,7<8,繼續遍歷,7>5,滿足條件就將5的下標賦值給k記錄下來,這時k=j=2, 然後5>4,滿足則k=j=3, 然後4>3,滿足則k=j=4,然後3>2,滿足則k=j=5,然後2>0滿足則k=j=8,最終k記錄下來的j值8就是這一次遍歷中資料最小的元素的陣列下標值,然後根據這個下標將這個值與第i個元素交換,即7與0交換,則最小的值就被放在了開頭,除了這個值其他的值仍為亂序,然後將i值增加,又從剩下的數中找最值並將其移到前面排好序的數後面來,以此類推。注意每次i值增加重新查詢時將k值初始化為i值。

注1.移動資料的次數已知為(n-1)次。

2.比較次數多不穩定。

原理將一組無序資料a[0],a[1],a[2]……a[n-1],a[n],從第乙個開始a[0]與a[1]比較,然後a[1]與a[2]比較,然後a[3]與a[4]比較,以此類推,到a[n-1]與a[n]比較,每一次比較,滿足條件前者更大(小)就交換兩者的位置,否則就不交換,每一輪從第乙個元素比較到後面,就會將剩下的元素中最大(小)的元素交換到最後面。

c**

#include

void main()

; int i, j, temp;

for (i = 0; i < 10-1; i++)//兩兩比較,共只需要比較n-1輪}}

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

}

詳解

第一輪比較,7與8相比,7<8,不滿足條件不交換,然後8>5,交換,序列變成7 5 8 4 3 2……,然後繼續從原來5的位置(交換後即為8)開始比較,8>4,交換,序列變成754832……然後8>3,交換,然後8>2,交換,然後8>6,交換,此時序列已經變成了7543268901,然後8<9,不滿足不交換,9>0,滿足交換,序列變成7543268091,最後9>1,交換,序列變成7543268019,即最大的數就被交換到最後了,然後又從第乙個元素開始新的一輪遍歷,第二輪遍歷後序列變成5432670189,即除9外的最大元素8又被交換到後面來了,第三輪遍歷後序列又變成4325601789,以此類推。

注1.穩定。

2.理論上總共進行n(n-1)/2次交換。

3.慢,每次只能移動兩個資料。

已知一組公升序排列資料a[1]、a[2]、……a[n],一組無序資料b[1]、b[2]、……b[m],需將二者合併成乙個公升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a陣列中某一資料a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無陣列a,可將b[1]當作n=1的陣列a)。

c**

#include

void main()

; int i, j, temp;

for (i = 1; i < 10; i++)//將a[0]看成是有序陣列,從a[1]開始遍歷}}

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

}

詳解

對於只有乙個無序陣列時,將這個無序陣列的第乙個元素看成有序陣列的元素,剩下的元素就是無序陣列,則迴圈i從i=1開始,此時有序陣列中只有7,然後迴圈j每一次從j=i開始,因為i之前的元素都是有序陣列中的數,則第i個元素為無序陣列中將要插入有序陣列中的數,第一輪比較時,8是將要插入的數,這是相當於8的位置已經算入了有序陣列,8與7比較,不滿足條件,則8放在7之後,即位置不變,但此時有序陣列已經變成了7,8,接下來又開始第二輪比較,5是將要插入的數,5與8比較,滿足條件,本來按照插入的規則,這時應將8向後移一位,而在這裡是通過8與5的位置交換來達到8向後移一位的目的,然後繼續讓8與7比較,滿足條件,7也向後移一位,此時有序陣列就變成了5,7,8。以此類推,間接的使用插入法實現了公升序排列。每一輪有序陣列的數都將增加乙個,無序陣列的數都將減少乙個,但其實至始至終都只有乙個陣列,只是巧妙的使用了他的空間。

注1.穩定,快。

2.較次數不一定,比較次數越多,插入點後的資料移動越多,特別是當資料總量龐大的時候,但用鍊錶可以解決這個問題。

簡單排序(選擇 冒泡 插入)

逆序對設a aa為乙個有n nn個數字的有序集 n 1n 1 n 1 其中所有數字各不相同。如果存在正整數i ii j jj使得1 i n1 leq i j leq n 1 in而且a i a j a i a j a i a j 則 a i a j a i a j a i a j 這個有序對稱為a的...

簡單排序演算法 冒泡 插入 選擇

1.氣泡排序 資料兩兩比較,每次冒出乙個最大 小 值,需要n n 1 1次比較,時間複雜度o n 2 基本 void sort int arr void swap int arr,int i,int j 如果給定陣列本身已經是排好的順序,那麼優化一下以上排序 如果第一次遍歷時沒有任何數交換,那麼證明...

簡單排序 選擇 插入 氣泡排序

3種順序排序方法。簡單排序是指時間複雜度為o n 2 的排序方法。1 選擇排序 將某個特定值有序的放置在最終位置上 外層迴圈控制最終位置的序號,內層迴圈從外層迴圈序號處向後遍歷,找到最小值。2 插入排序 插入排序將某個特定值插入到值列的某個子集中,並重複該過程 外層迴圈控制要插入的資料 從第二個數到...