排序演算法分析
阿新 • • 發佈:2019-01-22
據說在計算機發明後的很長一段時間內,30%以上的算力都是用來做排序這一件事情。
很久以來,自己由於習慣於依賴各種現成的庫,對於各種排序演算法生疏久已,甚至對於選擇、冒泡、插入等排序的區別都有些模糊不清了。我們慶幸於生在這個年代,安心享受著前輩大師們的智慧結晶,可以說是站在巨人的肩膀上眺望遠方了。此篇部落格用來總結各種排序演算法,強化對演算法重要性的認識,並且向各位對排序演算法做出改進的大師們致敬了。
一、選擇排序
·演算法描述
首先,找到陣列中最小的那個元素,使它和陣列中的第一個元素交換位置;再次,在剩下的元素中繼續找最小的那個,使他和陣列中的第二個元素交換位置。如此往復,直到整個陣列排序。
·演算法特點
1、執行時間和輸入無關
一個有序的陣列和一個元素隨機排列的陣列,排序的時間複雜度竟然一樣。
2、資料移動是最少的
資料交換隻在最內層迴圈之外的地方發生。交換的次數和陣列的大小是成線性關係的,我們研究的其他演算法都不具備這個特徵
·時間複雜度分析
對於長度為N的陣列,選擇排序需要N2/2次比較和N次交換。總的來說時間複雜度為平方級別O(N2)
·空間複雜度分析
基本不佔用多餘的記憶體空間,複雜度為O(1)。
·適用情景
任何剛學程式設計的菜鳥的第一思路基本就是這個了:)
·示例程式碼
//選擇排序
void selectSort(int *a,int size)
{
for(int i = 0; i < size; ++i)
{
//最小值索引
int minIndex = i;
for(int j = i+1; j < size; ++j)
{
//查詢最小值的索引
if(*(a+j) < *(a+minIndex))
{
minIndex = j;
}
}
//交換陣列中兩個位置的值
if(minIndex != i)
{
int tmp = *(a+i);
*(a+i) = *(a+minIndex);
*(a+minIndex) = tmp;
}
}
}
二、氣泡排序
三、插入排序
·演算法描述
我們平時打撲克摸牌時,每摸到一張牌,就要插入到手中已排好序的所有牌中,插入排序的演算法跟這個很相似。陣列左側都是已拍好序的元素,讀取右側的每一個元素,都要插入到左側的有序元素中去,左側的有序元素,會根據新插入元素的位置,做部分整體的向右移位,當所有元素都已插入完畢時,排序結束。
·演算法特點
·時間複雜度
·空間複雜度
·適用情景
·示例程式碼
//插入排序
void insertsort(int *a,int size)
{
for(int i = 1; i < size; ++i)
{
for(int j = i; j > 0; j--)
{
if(*(a+j) < *(a+j-1))
{
int tmp = *(a+j);
*(a+j) = *(a+j-1);
*(a+j-1) = tmp;
}
else
{
break;
}
}
}
}