您的位置:首页 > 其它

几种排序算法

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++];
}
}
归并排序的设计思想就是将整个数组切割成一个个小块,然后将小块排好序,再直接合并。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: