注:
(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 基本思想 在要排序...