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

    VonGang原创,转载请注明:http://www.cnblogs.com/vongang/

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

    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);
    }

    参考:http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F

  • 相关阅读:
    一些简单的逻辑题
    3种数据类型之间的转换
    搭建selenium + Python环境的总结:
    杂记
    Eclemma的安装
    LR----实现WebService测试
    LR--实现HTTP协议的接口测试
    Loadrunner---解决乱码问题
    selenium常用API实例
    JMeter中响应数据显示乱码问题解决
  • 原文地址:https://www.cnblogs.com/vongang/p/2143242.html
Copyright © 2011-2022 走看看