/*
選擇排序
每一趟選取第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...