排序算法之快速排序和归并排序

来源:互联网 发布:第九届杭州网络文化节 编辑:程序博客网 时间:2024/06/07 05:31

之所以将快速排序和归并排序是因为二者都用到了分治的思想,快速排序是冒泡法的一种改进。
1.快速排序
思想:在待排的n个数中,将第一个数做基准值,把序列分为三个组,第一个组中数据小于基准值,第二个组中数为基准值,第三个组中数据大于基准值,这是第一趟分割;再对第一组和第三组数进行上述处理,直至每组只有一个数据。
实现:(VC6.0运行通过)

#include<stdio.h>void kuaipai(int a[],int start,int end){    int i,j,temp,x;    i=start;    j=end;    x=a[start];//选取基准值    while(i<j)    {        while(i<j && x<a[j])//从右向左搜索小于基准值的数            j--;        if(i<j)//将该数与基准值调换        {            temp=x;            x=a[j];            a[j]=temp;        }        while(i<j && x>a[i])从左向右搜索大于基准值的数            i++;        if(i<j)//将该数与基准值交换        {            temp=x;            x=a[i];            a[i]=temp;        }        if(start<j)            kuaipai(a,start,j-1);        if(i<end)            kuaipai(a,j+1,end);    }//最终实现基准值左边数小于它,右边数大于它}void print(int s[],int n){    int i;    for(i=0;i<n;i++)        printf("%d ",s[i]);    printf("\n");}void main(){    int a[]={5,6,1,3,4,2,8};print(a,7);kuaipai(a,0,6);print(a,7);}

2.归并排序
思想:在《数据结构》中归并是将两个有序数组合并为一个有序数组,应用到排序中,可以不断将待排序列进行分割,直到每个序列长度为1,直到两两数比较,再两两相邻的有序子序列合并,不断重复合并子序列,最终为有序表。
实现:(VC6.0问题未解决)

#include<stdio.h>void merge(int a[],int start,int mid,int end,int temp[])//实现start--mid和mid+1--end的一次合并排序,假设二者均为有序序列{    int i,j,x,k;    k=0;    i=start;    j=mid+1;    x=a[0];    while(i<=mid && j<=end)    {        if(a[i]<=a[j])            temp[k++]=a[i++];        else            temp[k++]=a[j++];    }    while(i<=mid)        temp[k++]=a[i++];    while(j<end)        temp[k++]=a[j++];    /*    for(i=0;i<k;i++)        a[i]=temp[i];    */}void mergesort(int s[],int start,int end,int temp[]){    int mid;    if(start<end)    {        mid=(start+end)/2;        mergesort(s,start,mid,temp);        mergesort(s,mid+1,end,temp);        merge(s,start,mid,end,temp);    }}void print(int s[],int n){    int i;    for(i=0;i<n;i++)        printf("%d ",s[i]);    printf("\n");}void main(){    int i;    int b[7];    int a[]={5,6,1,3,4,2,8};    print(a,7);    mergesort(a,0,7,b);    print(b,7);}
0 0
原创粉丝点击