幾種簡單的排序演算法總結

2022-06-03 18:12:16 字數 2412 閱讀 9307

注:

(1)以下所有排序演算法均按照從小到大的順序排列

(2)以下演算法中用到的交換函式都一樣,如下:

void swap(int *a,int i,int j)

因此不在每個排序演算法中進行詳解

1.氣泡排序

1.最簡單的氣泡排序

思想:該排序演算法在排序的過程中總共進行n-1趟排序,每一趟排序都將當前的關鍵字和其後面的每乙個關鍵字進行比較,若當前關鍵字大於其後面的關鍵字則進行交換。

**實現如下:

void bubblesort(int *a)        //a表示待排序的記錄集合,這裡以陣列儲存為例,以下排序演算法相同,即都是對陣列裡的記錄元素進行排序}}

}分析:

該演算法從嚴格意義上講並不是標準的氣泡排序,因為不滿則「兩兩比較相鄰記錄」的氣泡排序思想,它更應該是最最簡單的交換排序。

該演算法**簡單易懂,卻是有缺陷的。每一趟的比較和交換對下一輪沒有任何影響,將導致進行很多重複的比較,演算法效率是非常低的  

2.氣泡排序

思想

:跟上面的排序演算法的思想一樣,都是當前趟的記錄跟其之後的記錄相比,只是該演算法不同的是:每一趟都是兩個相鄰記錄的

比較**實現如下(藍色加粗的即為和上面演算法不同的部分):

void bubblesort(int *a)}}

}3.氣泡排序演算法的優化

思想:該演算法在上訴氣泡排序演算法的基礎上進行優化,由上面可知,若進過第一趟排序後若結果已經有序,則後面還要進行迴圈判斷工作,因此該演算法實現的是當在某一趟排序後若該序列已經有序,則不再進行迴圈比較了。

**實現如下:

void bubblesort(int *a)}}

}4.冒泡複雜度分析

時間複雜度:

最好的情況:也就是帶排序的記錄集合本身是有序的,那麼需要進行n-1(n為待排序的記錄個數,**中為maxsize)次比較,沒有資料交換,時間複雜度為o(n)

最壞的情況:也就是待排序的記錄集合本市是逆序的,那麼時間複雜度為o(n*n)。

因此平均複雜度為o(n * n)。

空間複雜度:

由於該演算法沒有借助輔助空間,所以空間複雜度為常數,即為o(1)。

穩定性:

穩定2.簡單選擇排序

思想:對待排序的n個記錄進行n-1趟迴圈,每一趟進行兩兩相鄰比較找到該趟最小的記錄和當前記錄進行比較,若最小記錄的位置不是當前記錄所在的位置,則兩者進行交換。

**實現如下:

void selectsort(int *a)

}if(i != min)            //若min不等於當前記錄的下標}}

簡單選擇排序複雜度分析:

時間複雜度:

最好情況:即待排序記錄集合本身是有序的,需要比較的次數是1+2+...+(n-1) = n * (n - 1) / 2,不需要交換資料。由於最終的

時間複雜度是比較與交換次數之和,因此總的時間複雜度為o(n * n)。

最壞情況:即待排序的記錄集合本身是逆序的,需要比較的次數同最好情況相同都為n * (n - 1) / 2,交換的次數是n-1次,因此最終的時間複雜度也是o(n * n)。

因此平均複雜度為o(n * n)。

空間複雜度:

由於該演算法不需要輔助空間,因此空間複雜度為常數,即為o(1)。

穩定性:

不穩定3.直接插入排序

思想:該演算法的儲存結構陣列a[0]不存放記錄(不同於上面演算法),用作哨兵,每一趟都假設其前面的記錄集合是有序的,然後比較當前記錄和其前面相鄰的記錄,若小於其前面相鄰記錄,則把該值放在a[0]的位置上,然後從其前面相鄰記錄向前開始遍歷,只要記錄小於a[0]的記錄,則把當前記錄後移,直到大於等於a[0]元素則退出迴圈,然後把a[0]的記錄插入到適當位置,則結束當前趟的操作。

**實現如下:

void insertsort(int *a)

a[j + 1] = a[0];    //插入到正確位置}}

}直接插入排序演算法複雜度分析:

時間複雜度:

最好情況:即帶排序的集合本身就是有序的,則需要比較n-1次,不需要移動,因此時間複雜度為o(n)。

最壞情況:即待排序的集合本身是逆序的,則需要比較2+3+...+n = (n + 2) * (n - 1) / 2次,需要移動3+4+...+(n+1) = (n + 4)*(n - 1) /2次,因此時間複雜度為o(n * n)。

因此平均複雜度為o(n * n)。

空間複雜度:

由於該演算法需要乙個輔助空間(a[0]),因此空間複雜度為常數,即為o(1)。

穩定性:

穩定

幾種簡單的排序總結

氣泡排序public static void main string args output a 共排序n 1趟 for int i 0 i1 i i代表趟數 每一趟從第乙個元素到倒數第二個元素 for int j 0 j1 i j output a 選擇排序public static void m...

幾種簡單的排序演算法

整理了一下幾種簡單的排序演算法,暫時先貼上演算法,以後有時間在乙個乙個注釋 參考 下面是 部分 include 演算法1 氣泡排序,時間複雜度o n 2 基本思想 從最後乙個數開始,每次相鄰兩個數字比較,較小數往上浮動 void bubblesort int a,int c 演算法2 選擇排序,時間...

幾種簡單的排序演算法

1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 直接選擇排序 堆排序 4 歸併排序 5 分配排序 基數排序 所需輔助空間最多 歸併排序 所需輔助空間最少 堆排序 平均速度最快 快速排序 不穩定 快速排序,希爾排序,堆排序。1.直接插入排序 1 基本思想 在要排序...