您的位置:首页 > 其它

几种简单的排序算法

2015-10-26 15:15 337 查看
整理了一下几种简单的排序算法,暂时先贴上算法,以后有时间在一个一个注释

参考:http://www.360doc.com/content/14/0804/11/1073512_399302715.shtml
http://blog.csdn.net/han_xiaoyang/article/details/12163251
下面是代码部分:

#include <iostream>

//算法1:冒泡排序,时间复杂度O(n^2)
//基本思想:从最后一个数开始,每次相邻两个数字比较,较小数往上浮动
void BubbleSort(int *a,int c)
{
int temp;
for(int i=0;i<c-1;i++)
{
for(int j=c-1;j>i;j--)
{
if(a[j]<=a[j-1])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
}

//算法2:选择排序,时间复杂度O(n^2)
//基本思想:每次选出一最小的数放在前面,依次类推
void SelectSort(int *a,int c)
{
int key,temp;
for(int i=0;i<c-1;i++)
{
key=i;
for(int j=i+1;j<c;j++)
{
if(a[key]>a[j])
key=j;
}
temp=a[i];
a[i]=a[key];
a[key]=temp;
}
}

//算法3:插入排序,时间复杂度O(n^2)
//基本思想:假设该数组前n-1个是排好的,将第n个插入已排好的队列中
void InsertSort(int *a,int c)
{
int temp,j;
for(int i=1;i<c;i++)
{
temp=a[i];
j=i-1;
while((j>=0) && a[j]>temp)
{
a[j+1]=a[j];
a[j]=temp;
j--;
}
}
}

//算法4:希尔排序
//基本思想:插入排序的改进,按增量d分组插入排序,最后一个增量为1
void ShellSort(int *a,int c)
{
int temp;
for(int increce=c/2;increce>0;increce/=2)
{
for(int i=increce;i<c;i++)//前increce个数不动,后面的数进行插入排序
{
for(int j=i-increce;j>=0 && a[j+increce]<a[j]; j-=increce)
{
temp=a[j];
a[j]=a[j+increce];
a[j+increce]=temp;
}
}
}
}

//算法5:快速排序
//基本思想:先取一个数作为基准,比他大的放在右边,比他小的放在左边,然后递归查询;
void QuickSort(int *a,int left,int right)
{
if(left>=right)
return ;
int i=left,j=right;
int key=a[left];
while(i<j)
{
while(i<j && key<=a[j])
j--;//后退一个,继续查找
a[i]=a[j];
while(i<j && key>=a[i])
i++;//前进一个,继续查找
a[j]=a[i];
}
a[i]=key;
QuickSort(a,left,i-1);
QuickSort(a,i+1,right);
}

//算法6:堆排序
//基本思想:先构建大顶堆,将根结点和最后一个元素交换,一直循环到根节点
void HeapAdjust(int *a,int p,int c)
{
int temp=a[p];//先将父节点保存在中间变量中
for(int i=p*2+1;i<c;i*=2+1)
{
if(i<c-1 && a[i]<a[i+1])
i++;//i为两个子节点中的最大值
if(a[p]>=a[i])
break;//自己点比父节点都小则退出循环
a[p]=a[i];
p=i;
a[p]=temp;
}
}

void HeapSort(int *a,int c)
{
int temp;
//构建大顶堆,i初始值为c/2-1是因为二叉树的性质可得起父节点个数
for(int i=c/2-1;i>=0;i--)
HeapAdjust(a,i,c);
for(i=c-1;i>0;i--)
{
//取出根节点放在最后
temp=a[i];
a[i]=a[0];
a[0]=temp;
//再次构建大顶堆
HeapAdjust(a,0,i);
}
}

//算法7:归并排序
//基本思想:先分割,排序后归并
void Merge(int *a,int *b,int start,int middle,int end)
{
int i=start,m=middle;
int j=middle+1,n=end;
int k=0;//记录b中个数
while(i<=m && j<=n)
{
if(a[i]>a[j])
b[k++]=a[j++];
else
b[k++]=a[i++];

}
while(i<=m)
b[k++]=a[i++];
while(j<=n)
b[k++]=a[j++];
for(i=start,k=0;i<=end;i++)
a[i]=b[k++];
}

void MergeSort(int *a,int *b,int start,int end)
{
int middle=(start+end)/2;//分割点
if(start<end)
{
//分割
MergeSort(a,b,start,middle);
MergeSort(a,b,middle+1,end);
//归并排序
Merge(a,b,start,middle,end);
}
}

int main()
{
int a[9]={50,10,90,30,70,40,80,60,20};
int b[9];
int c=9;
//BubbleSort(a,c);
//SelectSort(a,c);
//InsertSort(a,c);
//ShellSort(a,c);
//QuickSort(a,0,c);
//HeapSort(a,c);
MergeSort(a,b,0,c-1);
for(int i=0;i<c;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: