zoukankan      html  css  js  c++  java
  • 快速排序和归并排序(C语言)

    1.0快速排序算法

    (1)分解 (2)递归求解 (3)合并

    int partition(int a[],int p,int r)

    {

        int i=p,j=r+1;

        int x=a[p];

        int temp;

        while(1)  //将<x的元素交换到左边元素,>x的元素交换到右边元素

        {

          while(a[++i]<x && i<r);

          while(a[--j]>x);

          if(i>=j)

            break;

          temp=a[i];

          a[i]=a[j];

          a[j]=temp;

          }

          a[p]=a[j];

          a[j]=x;

          return j;

    }

    void qSort(int a[],int p,int r,int num)

    {

        int i;

        if(p<r)

        {

        int q=partition(a,p,r);

        qSort(a,p,q-1,num);  //对左半段排序

        qSort(a,q+1,r,num); //对右半段排序

        }

        printf("快速排序过程:");

        for(i=0;i<num;i++)

        {

          printf("%d ",a[i]);

        }

          printf(" ");

     }

    int main()

    {

    int num;

    int i;

    int a[100];

    printf("请输入数组长度:");

    scanf("%d",&num);

    printf("请输入数组: ");

    for(i=0;i<num;i++)

    {

    scanf("%d",&a[i]);

    }

    qSort(a,0,num-1,num);

    printf("快速排序结果:");

    for(i=0;i<num;i++)

    {

    printf("%d ",a[i]);

    }

    return 0;

    }

    2.0归并排序算法

    将两个有序的左右子表(以mid区分),合并成一个有序的表

    void merge(int a[],int first,int mid,int last)

    {

    int indexA=first;

    int indexB=mid+1;

    int tempIndex=0;

    int i;

    static int temp[1000];

    while(indexA<=mid && indexB<=last)//进行左右子表的遍历,如果其中有一个子表遍历完,则跳出循环

    {

    if(a[indexA]<a[indexB])

    {

      temp[tempIndex++]=a[indexA++];

    }

    else

    {

      temp[tempIndex++]=a[indexB++];

    }

    }

        //有一侧子表遍历完后,跳出循环,将另外一侧子表剩下的数一次放入暂存数组中(有序)

    while(indexA<=mid)

    {

      temp[tempIndex++]=a[indexA++];

    }

    while(indexB<=last)

    {

      temp[tempIndex++]=a[indexB++];

    }

    //将暂存数组中有序的数列写入目标数组的制定位置,使进行归并的数组段有序

    tempIndex=0;

    for(i=first;i<=last;i++)

    {

      a[i]=temp[tempIndex++];

    }

    }

    void mergeSort(int a[],int first,int last,int num)

    {

    int i;

    if(first<last)//子表的长度大于1,则进入下面的递归处理

    {

      int mid=(first+last)/2;

      mergeSort(a,first,mid,num);

      mergeSort(a,mid+1,first,num);

      merge(a,first,mid,last);

    }

    printf("合并排序时的数组: ");

    for(i=0;i<num;i++)

    {

      printf("%d ",a[i]);

    }

    printf(" ");

    }

    int main()

    {

    int num;

    int i;

    int a[100];

    printf("请输入数组长度:");

    scanf("%d",&num);

    printf("请输入数组: ");

    for(i=0;i<num;i++)

    {

      scanf("%d",&a[i]);

    }

    mergeSort(a,0,num-1,num);

         printf("合并排序后的数组: ");

    for(i=0;i<num;i++)

    {

      printf("%d ",a[i]);

        }

          return 0;

     }

  • 相关阅读:
    cmd ora12560协议适配器错误
    WinPEter制作U盘启动盘
    KERNEL_SECURITY_CHECK_FAILURE
    Linux系统下关闭与启动Oracle11g的顺序与命令
    oracle口令文件在windows和linux系统下的命名和位置
    战士倒下了
    手游中第三方的登陆和支付总结
    诡异的循环
    关于空类的继承的问题
    C++的缺陷指针
  • 原文地址:https://www.cnblogs.com/tandy/p/4910032.html
Copyright © 2011-2022 走看看