几种排序算法
2015-11-15 17:21
357 查看
//插入排序void sort(int a[],inta_size)
{
int key,i,j;
for(i=1;i<a_size;i++)
{
key=a[i];
j=i-1;
while(key<a[j])
{
a[j+1]=a[j];
j--;
}
a[++j]=key;
}
printf("\n");
print(a,a_size);
}
插入排序的设计思想就是按照从数组a[1]开始(当然也可以从0开始只不过从0开始会多加一个判断得不偿失),每次循环所要加入的元素,如果大于前一个元素,就直接加入,否则就将将前面已经排好序的数组向后推,一直推到前面的元素小于当前所要加入的元素,一直插入,直至整个数组结束。
//希尔排序void sort(int *a,intn)
{
int key,j;
int mid=n/2;
while(mid>=1)
{
for(inti=mid+1;i<n;i++)
{
key=a[i];
j=i-mid;
while(key<a[j]&&j>=0)
{
a[j+mid]=a[j];
j=j-mid;
}
a[j+mid]=key;
}
mid=mid/2;
}
}
希尔排序的设计思想就是在插入排序的设计思想上不断的跳跃,避免了极端情况的发生(数组要大规模的向右移)。其本质和插入排序差不多。
//归并排序void sort(int *a,int*c,int start,intend)
{
void merge(int *a,int *b,int start,int mid,int
end);
int b[20];
while(end>start)
{
int mid=(end-start)/2;
sort(a,b,start,mid);
sort(a,b,mid+1,end);
merge(a,b,start,mid,end);
}
if(end==start)
{
c[end]=a[end];
}
}
void merge(int *a,int *b,int start,int mid,int end)
{
int i=start,j=mid+1,k=start;
while(i<=mid&&j<=end)
{
if(a[i]<a[j])
{
b[k]=a[i];
k++;
i++;
}
else
{
b[k]=a[j];
k++;
j++;
}
}
while(i<=mid)
{
b[k++]=a[i++];
}
while(j<=end)
{
b[k++]=a[j++];
}
}
归并排序的设计思想就是将整个数组切割成一个个小块,然后将小块排好序,再直接合并。
{
int key,i,j;
for(i=1;i<a_size;i++)
{
key=a[i];
j=i-1;
while(key<a[j])
{
a[j+1]=a[j];
j--;
}
a[++j]=key;
}
printf("\n");
print(a,a_size);
}
插入排序的设计思想就是按照从数组a[1]开始(当然也可以从0开始只不过从0开始会多加一个判断得不偿失),每次循环所要加入的元素,如果大于前一个元素,就直接加入,否则就将将前面已经排好序的数组向后推,一直推到前面的元素小于当前所要加入的元素,一直插入,直至整个数组结束。
//希尔排序void sort(int *a,intn)
{
int key,j;
int mid=n/2;
while(mid>=1)
{
for(inti=mid+1;i<n;i++)
{
key=a[i];
j=i-mid;
while(key<a[j]&&j>=0)
{
a[j+mid]=a[j];
j=j-mid;
}
a[j+mid]=key;
}
mid=mid/2;
}
}
希尔排序的设计思想就是在插入排序的设计思想上不断的跳跃,避免了极端情况的发生(数组要大规模的向右移)。其本质和插入排序差不多。
//归并排序void sort(int *a,int*c,int start,intend)
{
void merge(int *a,int *b,int start,int mid,int
end);
int b[20];
while(end>start)
{
int mid=(end-start)/2;
sort(a,b,start,mid);
sort(a,b,mid+1,end);
merge(a,b,start,mid,end);
}
if(end==start)
{
c[end]=a[end];
}
}
void merge(int *a,int *b,int start,int mid,int end)
{
int i=start,j=mid+1,k=start;
while(i<=mid&&j<=end)
{
if(a[i]<a[j])
{
b[k]=a[i];
k++;
i++;
}
else
{
b[k]=a[j];
k++;
j++;
}
}
while(i<=mid)
{
b[k++]=a[i++];
}
while(j<=end)
{
b[k++]=a[j++];
}
}
归并排序的设计思想就是将整个数组切割成一个个小块,然后将小块排好序,再直接合并。
相关文章推荐
- ArrayList源码分析(Java&Android)
- 二叉树与哈夫曼树
- kettle4.4在eclipse中运行调试
- 《大道至简》第七章和第八章读后感
- java中的静态导入
- 迭代创建目录
- Java中的基本类型与封装类型以及自动装箱、拆箱、String类型的解释
- This version of the rendering library is more recent than your version of ADT plug-in. Please update
- git安装以及使用
- Django1.8 python3 验证码 ImageFont.truetype IOError:cannot openresource
- hdu 4283 You Are the One(区间dp)
- OC学习心得之面向对象三大特征
- 字符串string
- 结构体实现模拟时钟
- Linux 部署tomcat-实战操作
- 在QtCreator上 使用版本控制系统Git ---- 注意事项!
- 线索二叉树(先序,中序,后序)
- VC和MATLAB混合开发经验总结
- 野人学Android第二弹——Handler与Thread之间的关系
- 关于NSString的练习题