排序是計算機應用中的乙個非常重要的操作。平常我們總會聽到一些演算法,但是我們總是似懂非懂的寫著**,今天我將一般常見的排序演算法進行乙個總結。
本次總結只涉及內部排序(所謂內部排序是指在記憶體中進行的排序)
首先說乙個概念:穩定排序與非穩定排序
如果乙個序列中原來相同的元素,排序完成後,仍然保持著原來的順序,那麼就成為穩定排序,反之就是非穩定排序。
插入排序
(1).直接插入排序(straiht insertion sort)
演算法描述:如果有乙個已經排好序的序列 ,當要插入乙個r(66)時,需要與各個元素進行比較,r(35)演算法開始時,取乙個元素為原序列,然後重複執行上面的方法,將每個元素插入到序列中。
void insertsort(sllist &l)複製**l[j+1] = l[0];
}}
此演算法的時間複雜度為o(n2)
快速排序
快速排序是一種基於交換的排序方法,最常見的有氣泡排序(bubblesort),快速排序(改進的氣泡排序)(quicksort)
下面先說氣泡排序:
氣泡排序的基本思想是在一次排序中,將最大的元素沉入底部,然後縮小範圍,繼續進行。
具體的說:取第乙個元素,然後與第二個元素進行比較,如果比第二個大,那麼交換,否則,不交換,然後取第二個元素與第三個元素比較,同樣用前面的方法,大則交換,直到將最大的元素交換到最底部,這是第一遍排序結束,然後,縮小範圍,從第二個元素開始,在此運用上面的一遍排序方法。直到範圍縮小為乙個元素的時候,排序結束。
下面是用c++語言描述的乙個氣泡排序的演算法:
int a[5] = ;複製**for(int i=4;i>=0;i--)
for(int j = 0;j<=i;j++)
}for(int s = 0;s<5;s++)
cout《複製**
由於最近在學習彙編,所以在emu8086上寫了乙個**段,實現氣泡排序:
;彙編氣泡排序演算法
n equ 5
mov cx,n-1
j03:push cx
lea bx,a
j02:mov al,[bx]
cmp al,[bx+1]
jnb j01
xchg al,[bx+1]
mov [bx],al
j01:inc bx
loop j02
pop cx
loop j03
a db 1,2,3,4,
選擇排序
選擇排序(selection sort)的基本思想是,每一趟排序在n-i+1(i=1,2,3....,n-1)中選取關鍵字最小的記錄作為有序序列的第i個記錄。
(1)最為簡單的是簡單選擇排序(sample selection sort)
void selectsort(sqllist &l)複製**}
(2)樹形選擇排序(tree selection sort),又稱錦標賽排序(tournament sort),是一種按照錦標賽的思想,兩兩比較,然後在剩餘的【n/2】個較小的元素中在進行兩兩比較,如此重複,最後選出最小的記錄為止。
(3)堆排序(heap sort)
先介紹一下大頂堆與小頂堆:
在一棵二叉樹中,如果所有父節點比兒子節點都大,稱這顆樹為大頂堆,反之,為小頂堆。
那麼堆排序的思想便是將乙個無序序列構建成大頂堆(或小頂堆)然後取出堆頂元素,再次調整這個堆,使之在此變成大頂推(或小頂堆),如此將所有元素取出,便排好了序。
歸併排序
歸併排序(merging sort)
所謂歸併,簡單的講,就是將兩個有序的序列,合成乙個新的有序表。我們用這個思想,可以把乙個n個元素的序列,看成n個長度為1的子串行,然後利用歸併排序,兩兩合併,然後的到了n/2個長度為2的子串行,再次進行合併,重複上面的步驟,直到合併為乙個序列,則歸併完成。
排序演算法(內部排序)總結
排序是計算機應用中的乙個非常重要的操作。平常我們總會聽到一些演算法,但是我們總是似懂非懂的寫著 今天我將一般常見的排序演算法進行乙個總結。本次總結只涉及內部排序 所謂內部排序是指在記憶體中進行的排序 首先說乙個概念 穩定排序與非穩定排序 如果乙個序列中原來相同的元素,排序完成後,仍然保持著原來的順序...
內部排序總結
排序方式 時間複雜度 空間複雜度 穩定性複雜性 平均情況 最壞情況 最好情況 直接插入排序 o n 2 o n 2 o n o 1 穩定簡單 希爾排序 o n 1.3 n 2 o 1 不穩定較複雜 氣泡排序 o n 2 o n 2 o n o 1 穩定簡單 快速排序 o nlog2 n o n 2 ...
內部排序演算法
內部排序是指待排序列完全存放在記憶體中所進行的排序過程,適合不太大的元素序列。1.快速排序int partition int a,int low,int high a low a high while low2.並歸排序 void merging int list1,int list1 size,i...