您的位置:首页 > 理论基础 > 数据结构算法

数据结构-练习 11 冒泡排序 插入排序 归并排序

2013-06-12 18:56 489 查看
本博文介绍三中最基本的排序算法,冒泡,插入,归并。

一,冒泡:最简单,也是最直接的排序算法,从前往后,每个元素都与其后满足条件的元素交换。时间复杂度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;
}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐