一、選擇排序
演算法思想:對於有n個元素的陣列,一共有n躺排序,每趟排序要保證前i
ii項元素已經排好序,對於第i
ii趟排序,從第i
ii個元素開始遍歷陣列,將當前遍歷元素中最小的值與第i個元素交換。具體**實現如下:
#include
#include
#include
using
namespace std;
class
sortalg
}swap
(array[i]
, array[index]);
//每趟排序後交換
}return;}
};intmain()
; sortalg solution;
solution.
selectionsort
(array)
; vector<
int>
::iterator it = array.
begin()
;while
(it != array.
end())
cout<<
*it++
}
演算法時間複雜度分析:平均複雜度為o(n
2)
o(n^2)
o(n2
);最好情況考慮當前陣列已經有序,則內層迴圈無法進去,即為o(n
)o(n)
o(n)
。穩定性分析:不穩定排序。考慮陣列,第一次排序第乙個5和後面的2交換,即此時原來陣列位於乙個5在排序後已經在第二個5後面,所以是不穩定排序。
二、插入排序
演算法思想:由n−1
n-1n−
1趟排序組成。對於第i
ii趟排序,保證第0項到第i
ii項元素為已排序狀態。注意和選擇排序的區別:**選擇排序每趟排序保證前i
ii項對於整個陣列來說是排好序的,而插入排序只保證區域性排序好的。**有點繞,分析下**就可以知道原理:
void
insertsort
(vector<
int>
& array)
}return
;}
演算法時間複雜度分析:平均和最優都和選擇排序一樣,分析的情況也一樣。是穩定排序。
三、快速排序
void
quicksort
(vector<
int>
& array,
int begin,
int end)
while
(begin < end && array[begin]
< temp)
begin++;if
(begin < end)
} array[begin]
= temp;
if(begin-
1> temp_begin)
quicksort
(array, temp_begin, begin-1)
;if(temp_end > end +1)
quicksort
(array, end +
1, temp_end)
;return
;}
演算法分析:時間平均複雜度是o(n
logn
)o(nlogn)
o(nlog
n),不穩定排序。
四、堆排序
演算法思想:主要就是構建乙個完全二叉樹,首先要知道幾個二叉樹的性質:1.對於乙個有n個結點的完全二叉樹來說,第乙個非葉子結點的序號為i=n
2−
1i=\dfrac-1
i=2n−
1;2.對於乙個結點i
ii來說,如果它有左右子結點,則左結點序號為2∗i
+1
2*i+1
2∗i+
1,右結點序號為2∗i
+2
2*i+2
2∗i+
2這篇部落格講得很清晰,**並茂:堆排序。本人實現的**如下所示:
void
adjust_heap
(vector<
int>
& array,
int size,
int index)
}//堆排序
void
heapsort
(vector<
int>
& array,
int size,
int k)
//找到最大根,將其和最後乙個元素交換,然後繼續調整;
for(
int i = size -
1; i >
0; i--
)}
演算法分析:時間平均複雜度是o(n
logn
)o(nlogn)
o(nlog
n),不穩定排序。
五、歸併排序
演算法思想:主要思想還是分治思想,將當前需要排序的陣列遞迴分治成子陣列(直到遞迴到只有乙個元素時停止,因為一組乙個元素肯定是有序的),比如已知遞迴到array[0]和array[1]先比較大小,array[2]和array[3]再比較大小…依次比較完。之後在將array[0]和array[1]組成有序的陣列跟array[2]和array[3]組成有序的陣列比較…這個過程就叫做歸併過程。個人覺得講得比較清楚的部落格是:歸併排序。
演算法分析:每個元素大概需要log
(n
)log(n)
log(n)
次比較,一共有n
nn個元素,所以時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n)。是穩定的排序。
**如下所示:
//輔助排序函式
void
mergehelp
(vector<
int>
&array,
int left,
int mid,
int right)
//歸併排序函式入口
void
mergesort
(vector<
int>
&array,
int left,
int right)
}
幾種常見的排序演算法(C
說到排序,網上一搜就有一大堆的部落格資料,涵蓋各種語言實現,而許多演算法書中更是寫的很詳細,寫此部落格只是記錄下所敲的這幾行 以便日後檢視。直接貼domo ifndef sort h define sort h include include using namespace std template...
幾種常見的排序C實現
include include 氣泡排序從小到大 第一趟得到最大的存到陣列的最後,第二趟得到陣列的第二大的,存到陣列的倒數第二位。依次。void bubble sort int p 列印輸出 for int i 0 i int length 6 取增量 int step length 2 while...
C語言實現幾種常見排序演算法
worker.c created on 2010 7 1 author panfei include void swap int x,int y 插入排序 公升序 void insertsort int arr,int size arr j 1 to insert 選擇排序 降序 void sele...