本博文介绍三中最基本的排序算法,冒泡,插入,归并。
一,冒泡:最简单,也是最直接的排序算法,从前往后,每个元素都与其后满足条件的元素交换。时间复杂度O(N^2)。
代码如下:
#include<iostream>
using namespace std;
void sort(int*a,int n)
{
int temp;
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(a[j]<a[i])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
int main()
{
int a[5]={1,5,3,2,6};
sort(a,5);
for(int i=0;i<5;++i)
cout<<a[i];
return 0;
}
二,插入:对于前面已排好的序列,用当前元素分别与前面排好顺序的元素比较,当找到满足条件的元素时,整体移动。时间复杂度为O(N^2)。
代码如下:
template <typename T>
class InsertCla
{
public:
InsertCla(T *Arra,int length_):inputArra(Arra),length(length_){}
void getSortedArra();
~InsertCla(){}
private :
T* inputArra;
int length;
};
//非递增排列
template<typename T> inline void InsertCla<T>::getSortedArra()
{
int i,j;
T temp;
for(i=1;i<=4;i++){
temp=inputArra[i];
for(j=i-1;j>=0;j--){
if(temp<inputArra[j]){
inputArra[j+1]=inputArra[j];
}else
break;
}
inputArra[j+1]=temp;
}
}
三,归并排序,归并主要利用到了分而治之,递归的思想。时间复杂度为:O(NlgN)。
对两个排好序的数组组合成一个:
void MergeSort(int* v, int first, int mid, int last)
{ //空间复杂度增加了
queue<int>* tempV = new queue<int>();
int indexA, indexB;
indexA = first;
indexB = mid;
while (indexA < mid && indexB < last)
{
if (v[indexA] < v[indexB])
{
tempV->push(v[indexA]);
indexA++;
}
else
{
tempV->push(v[indexB]);
indexB++;
}
}
while (indexA < mid)
{
tempV->push(v[indexA]);
indexA++;
}
while (indexB < last)
{
tempV->push(v[indexB]);
indexB++;
}
int index = 0;
while (tempV->size() > 0)
{
v[first+index] = tempV->front();
tempV->pop();
index++;
}
}
递归调用,深度探索:
void Merg(int* a,int first,int last )
{
int middle;
if(first<last)
{
middle=(first+last)/2;
Merg(a,first,middle);
Merg(a,middle+1,last);
MergeSort(a,first,middle,last);
}
}
int main()
{
int a[6]={5,1,2,6,3,7};
Merg(a,0,5);
for(int i=0;i<6;++i)
cout<<a[i];
return 0;
}
测试结果: