交換排序
一旦發現秩序不滿足要求時就進行交換,知道整個序列滿足要求爲止。
冒泡排序
#include <stdio.h> #include <iostream> using namespace std; int main() { int a[5] = {3,1,4,5,2} ;//待排序數組 for(int i =0 ; i<4;i++) { for(int j = 0 ;j<4-i;j++) { if(a[j] > a[j+1]) { int temp =a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } for(int i = 0; i<5 ; i++) { printf("%d",a[i]); } return 0; }
運行結果:
假設待排序序列有n個,則需要n-1次比較,每一次中有n-i次比較。
算法分析:
時間複雜度:
最好的情況:只需進行一趟排序,在排序過程中進行n-1次關鍵字間的比較,且不移動記錄。(排序一個已經拍好的序列)
最壞情況:需進行n-1趟排序,總的關鍵字比較次數KCN和記錄移動次數RMN(每次交換都要移動三次記錄)。
KCN=n(n-1)/2
RMN = 3n(n-1)/2
空間複雜度:
只需要一個輔助存儲空間,所以空間複雜度爲O(1).
算法特點:
(1)穩定排序(因爲只有大於的情況下才交換位置)。
(2)可用於鏈式存儲結構。
(3)移動記錄次數較多,算法平均時間性能比直接插入排序差。當初始記錄無序,n較大時,此算法不宜採用。
快速排序
由冒泡排序改進而得
選擇待排序表中的第一個記錄作爲樞紐,附設兩個指針low和high,初始時分別指向表的下界和上界
-
選擇排序
簡單選擇排序
是最簡單的排序算法之一,每次都從待排序序列中選出最小的元素,插入到已經拍好的序列之中。
void selectSort()
{
for( int i = 0 ;i <= n; i++ )//進行n趟操作
{
int k=i;
for( int j = i ;j <= n; j++ ) //選出【1,n】中最小的元素,下標爲K。
{
if( A[j] < A[k] )
{
k = j;
}
int temp = A[i];
A[i] = A[k] ;
A[k] = temp;
}
}
時間複雜度分析:
所需進行的移動次數較少: 最好情況:不移動 ;
最壞情況:3(n-1) ;
關鍵字的比較次數你 n(n-1),
空間複雜度:O(1);
樹形選擇排序
待排序的序列都作爲葉子節點
堆排序
較難
分治法: