O(n^2)的排序演算法
O(n^2)的排序演算法
- O(n^2)是比較基礎的排序演算法,效率較低,編碼簡答,易於實現,是一些簡單情景的首選。
- 在一些特殊的情況下,簡單的排序演算法更有效
- 簡單的排序演算法思想衍生出複雜的排序演算法
- 作為子過程,改進更復雜的排序演算法
選擇排序 Selection Sort
需要將下列數從小到大排列
從第一個開始排,找到比第一個(8)後面最小的數,是1
然後將其交換位置
此時的1就是最終排序的位置
後面的依次類推
C++程式碼實現
#include <iostream>
#include <algorithm>
using namespace std;
void selectionSort(int arr[], int n){
for(int i = 0 ; i < n ; i ++){
// 尋找[i, n)區間裡的最小值
int minIndex = i;
for( int j = i + 1 ; j < n ; j ++ )
if( arr[j] < arr[minIndex] )
minIndex = j;
//與最小值交換位置
swap( arr[i] , arr[minIndex] );
}
}
int main() {
//硬生成序列
int a[10] = {10,2,5,7,9,3,4,8,6,1};
selectionSort(a,10);
for( int i = 0 ; i < 10 ; i ++ )
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
稍加改造一下函式,使其對各種型別都通用
#include <iostream>
#include <string>
using namespace std;
template<typename T>
void selectionSort(T arr[], int n){
for(int i = 0 ; i < n ; i ++){
int minIndex = i;
for( int j = i + 1 ; j < n ; j ++ )
if( arr[j] < arr[minIndex] )
minIndex = j;
swap( arr[i] , arr[minIndex] );
}
}
int main() {
// 測試模板函式,傳入整型陣列
int a[10] = {10,9,8,7,6,5,4,3,2,1};
selectionSort( a , 10 );
for( int i = 0 ; i < 10 ; i ++ )
cout<<a[i]<<" ";
cout<<endl;
// 測試模板函式,傳入浮點數陣列
float b[4] = {4.4,3.3,2.2,1.1};
selectionSort(b,4);
for( int i = 0 ; i < 4 ; i ++ )
cout<<b[i]<<" ";
cout<<endl;
// 測試模板函式,傳入字串陣列
string c[4] = {"D","C","B","A"};
selectionSort(c,4);
for( int i = 0 ; i < 4 ; i ++ )
cout<<c[i]<<" ";
cout<<endl;
return 0;
}
結果:1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1.1 2.2 3.3 4.4
A B C D
插入排序 Insert Sort
雖然作為O(n^2)的排序演算法,但在陣列近乎有序的情況下,它的排序效率及其的高,甚至比O(nlogn)的演算法效率還要高,可以作為複雜演算法中的子過程。
需要將下列數從小到大排列
先將第二個數(6)與前面的數相比較,小的話就交換位置
然後再看第三個數(2)跟前面的數相比較,2<8,所以交換位置,再繼續跟前面的數(6)比較,2<6,所以繼續交換位置
後面的依次類推
C++程式碼實現
template<typename T>
void insertionSort(T arr[], int n){
for( int i = 1 ; i < n ; i ++ ) {
// 尋找元素arr[i]合適的插入位置
// 寫法1
// for( int j = i ; j > 0 ; j-- )
// if( arr[j] < arr[j-1] )
// swap( arr[j] , arr[j-1] );
// else
// break;
// 寫法2
for( int j = i ; j > 0 && arr[j] < arr[j-1] ; j -- )
swap( arr[j] , arr[j-1] );
}
return;
}
改進版的插入排序
由於前面的插入排序一個swap需要經過三步,效率不是很高,以下是改進版的插入排序演算法,不使用swap進行交換,而是通過先將數複製下來,再與前面的進行比對,總體思想是一樣的。
先把第二個數(6)複製一份,先看看它適不適合放在當前位置,讓6跟前面的數(8)作比較,因為6<8,所以顯然不適合當前位置,而8適合當前位置。
把6往後移,因為是第一個元素了,所以直接把6放在這個位置
後面依次類推
C++程式碼實現
void insertionSort(T arr[], int n){
for( int i = 1 ; i < n ; i ++ ) {
// 寫法3
T e = arr[i];
int j; // j儲存元素e應該插入的位置
for (j = i; j > 0 && arr[j-1] > e; j--)
arr[j] = arr[j-1];
arr[j] = e;
}
相關文章
- 時間複雜度為 O (n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O(n^2) 的排序演算法時間複雜度排序演算法
- JavaScript 排序演算法(O log(N)等)JavaScript排序演算法
- 演算法中的O(1), O(n),O(logn), O(nlogn)演算法
- 11.經典O(n²)比較型排序演算法排序演算法
- Java實現:排序演算法--時間複雜度為O(n² )Java排序演算法時間複雜度
- 時間複雜度O(1)、O(n)、O(n²)、O(nlogn)的含義時間複雜度
- 【漫畫】為什麼說O(n)複雜度的基數排序沒有快速排序快?複雜度排序
- 線性時間選擇(含平均情況O(n)和最壞情況O(n)演算法)演算法
- 時間複雜度為 O(nlogn) 的排序演算法時間複雜度排序演算法
- 時間複雜度為O(nlogn)的排序演算法時間複雜度排序演算法
- (Java) 演算法題:2的N次方Java演算法
- 用機器學習構建O(N)複雜度的排序演算法,可在GPU和TPU上加速計算機器學習複雜度排序演算法GPU
- 演算法排序:史上最全2演算法排序
- LCA Online Query with O(N) Memory and O(1) Time Complexity
- 指標-n個數的排序指標排序
- O(n)-O(1) 線性 RMQ 學習筆記MQ筆記
- 常用排序演算法總結(2)排序演算法
- 【一起學習排序演算法】2 氣泡排序排序演算法
- 後序+中序(前序+中序)重構樹,嚴格O(N)演算法演算法
- o2o系統 本地生活服務 微信o2o
- O(nlogn)快速排序-雙路排序+詳細註解排序
- 搞笑的排序演算法-睡覺排序排序演算法
- N皇后和N皇后2
- 【JAVA演算法】排序演算法 -- 快速排序Java演算法排序
- 排序演算法__桶排序排序演算法
- 排序演算法__快速排序排序演算法
- 排序演算法__堆排序排序演算法
- 排序演算法:快速排序排序演算法
- 排序演算法 - 堆排序排序演算法
- 排序演算法-堆排序排序演算法
- 排序演算法 - 快速排序排序演算法
- 2.插入排序演算法(Insertion_Sort)排序演算法
- 排序演算法之快速排序的實現排序演算法
- 佳弗O2O系統
- 快排思想O(N)求第k大數
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 化繁為簡的O2O業務模型模型
- 計算2的N次冪n 可輸入,n為自然數