常見排序總結

2021-08-24 23:16:51 字數 1940 閱讀 8080

/*

選擇排序

每一趟選取第i個關鍵字,與剩下的n-i關鍵字進行比較,找出最大的值與剛開始選擇的i下標對應的值交換

第一趟: 0 , 1~n-1

第二趟:1, 2~n-1

.....

應用場景

最好最壞情況時間複雜度都是o(n^2) 空間複雜度為o(1)

最壞情況:對相對有序的一組資料排序

不穩定 由其交換引起的

適用於數量不大並且交換次數少的情況下

*/

void select_sort(int *arr,int len)

} if(i != minindex)

}}

/*

氣泡排序

每趟兩個相鄰的資料比較,如果前者大於後者就交換位置;每趟最後乙個元素都是本趟元素裡最大的那個

所以在每趟的比較中,上一趟的最後乙個元素不再參與排序

本**是公升序排列 

給出的數字序列也是相對於公升序 那麼交換次數少 最好情況下時間複雜度o(n)

給出的數字序列是完全降序  那麼交換次數duo 最壞情況下時間複雜度o(n^2)

*/

void bulle_sort(int *arr,int len)

} }}

/*

直接插入排序

每趟選定乙個標兵位,標兵位開始往前遍歷 找出第乙個比標兵位小的位置

那麼這個位置的後面就是該標兵存放的位置

應用場景

給出的數字序列基本有序 最好情況下 時間複雜度o(n)

給出的數字基本無序 最壞情況下 時間複雜度o(n^2)

空間複雜度為o(1)

如果有少量或者大量資料都可以採用

*/

void insert_sort(int *arr,int len)

else

}arr[j+1] = tmp;

}}

/*

歸併排序 採用二路歸併法

開闢另乙個與舊陣列空間大小的陣列

兩個有序的歸併段 依次從頭開始比較 小的先放入到新開闢的陣列中 在繼續往後比較歸併 直至歸併為乙個歸併段

每一次歸併歸併段的增量為上一次的二倍

時間複雜度 一次歸併o(logn),整體歸併時間複雜度o(nlogn)

空間複雜度 o(n)

*/

void merge(int *arr,int len ,int gap)

else

}//兩個歸併段比完之後還有可能某個歸併段剩餘資料

while(low1 <= high1)

while(low2 <= high2)

low1 = high2+1;

high1 = low1+gap-1;

low2 = high1+1;

high2 = low2+gap-1/*

堆排序將陣列中的值虛擬的建立成乙個根堆

一次調整堆從上往下調整 時間複雜度為o(logn)

第一次建堆從下往上 建堆時間複雜度為o(n*lon)

堆排序的時間複雜度為 o(n*lon)

空間複雜度為o(1)

應用場景  

在不要求完全有序的情況下得到資料中最大或者最小的部分資料 可以選擇堆排序

*/void adjust(int *arr,int start,int end)

//判斷父節點的值與左右孩子中最大值的大小關係 如果小於最大值 則兩個值進行交換

//交換後需要比較i所在節點它的左右孩子與其當前值的大小關係

if( tmp < arr[i])

else

}arr[start] = tmp;

}void heap_sort(int *arr,int len)

int tmp = 0;

for( i = 0;i < len -1 ;++i)

}

常見排序演算法總結

sort.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std const int len 100 class csort 注意此處應該有分號 csort csort length len 建構函式,初始化陣列 arr j 1 ...

常見排序演算法總結

1.氣泡排序 蠻力法 基本思想 兩兩比較相鄰記錄,如果反序側交換,直到沒有反序的記錄為止。如果是正序排,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。時間複雜度 o n n void bubblesort int a,int n 優化的氣泡排序 if flag 0 break...

常見排序演算法(總結)

演算法名 時間複雜度 空間複雜度 穩定性氣泡排序o n2 o 1 不穩定 選擇排序o n2 o 1 不穩定 插入排序o n2 o 1 穩定 歸併排序o nlog n o n 可以優化到o 1 穩定 快速排序o nlog n o logn n 不穩定 堆排序o n logn o 1 不穩定 希爾排序o...