zoukankan      html  css  js  c++  java
  • 快速排序+归并排序

    快排过程很简单,就是一个二分的思想,过程如下(从小到大为例):

    1、取一个关键字;

    2、把序列中大于关键字的放在关键字右边;

    3、把序列中小于关键字的放在关键字左边;

    4、重复1-3步,直到序列有序;

    代码+注释:

    #include<stdio.h>
    #define N 100
    int  QuickSort1 (int r[], int low, int high)
    {    
        int  key;
        key=r[low];  /*取轴值记录关键字*/
        while(low<high) /*从表的两端交替地向中间扫描*/
        {
              while(low<high && r[high]>=key)high--;
               r[low]=r[high];  /*将比轴值记录小的交换到低端*/
             while (low<high && r[low]<=key) low++;
                r[high]=r[low];  /*将比轴值记录大的交换到高端*/
        }
        r[low]=key; /*轴值(支点)记录到位*/
        return low; /*返回轴值(支点)记录所在位置*/
    }
    void  QuickSort(int r[],int low,int high)
    {    /*对顺序表S中的子序列r[low…high]作快速排序*/
        int k;
        if(low<high)
        {
            k= QuickSort1 (r,low,high); /*将待排序序列一分为二*/    
            QuickSort (r,low,k-1); /*对小于轴值序列实现递归排序*/    
            QuickSort (r,k+1,high);  /*对大于轴值序列实现递归排序*/
        }
    }
    int main()
    {
        int a[N],n;
        scanf("%d",&n);//输入元素个数
        for(int i = 0; i < n; i++)
        {
            scanf("%d",a+i);
        }
        QuickSort(a,0,n-1);
        for(int i = 0; i < n; i++)
        {
            printf("%d ",a[i]);
        }
        putchar('\n');
        return 0;
    }

    归并排序(好东西来了):

    归并操作的过程如下:

    1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
    2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
    3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
    4. 重复步骤3直到某一指针达到序列尾
    5. 将另一序列剩下的所有元素直接复制到合并序列

    如图:

    实现代码:

    void merge(int array[], int low, int mid, int high)
    {
            int i, k;
            int *temp = (int *) malloc((high-low+1) * sizeof(int)); //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
            int begin1 = low;
            int end1 = mid;
            int begin2 = mid + 1;
            int end2 = high;
     
            for (k = 0; begin1 <= end1 && begin2 <= end2; ++k)  //比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
                    if(array[begin1]<=array[begin2])
                            temp[k] = array[begin1++];
                    else
                            temp[k] = array[begin2++];       
            if(begin1 <= end1) //若第一个序列有剩余,直接拷贝出来粘到合并序列尾
                    memcpy(temp+k, array+begin1, (end1-begin1+1)*sizeof(int));
            if(begin2 <= end2) //若第二个序列有剩余,直接拷贝出来粘到合并序列尾
                    memcpy(temp+k, array+begin2, (end2-begin2+1)*sizeof(int));
            memcpy(array+low, temp, (high-low+1)*sizeof(int));//将排序好的序列拷贝回数组中
            free(temp);
    }

    ps:转自http://www.cnblogs.com/vongang/

     

  • 相关阅读:
    修改linux资源限制
    Windows 建立链接
    Java & ant环境变量配置
    Linux 配置IP
    Spring-MVC 访问静态资源
    Maven 安装与配置
    OIM同步OID(OID-Connector 9.0.4.12)
    Connector|OIM向IBM TDS推送账号(LDAP3)
    TopFreeTheme精选免费模板【20130704】
    30+简约和平铺的WordPress复古主题
  • 原文地址:https://www.cnblogs.com/timeship/p/2622297.html
Copyright © 2011-2022 走看看