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/

     

  • 相关阅读:
    并发编程之多线程(理论部分)
    基于TCP和UDP的socket
    ajax笔记 显示出所城市名称 ShowCity.aspx Html代码
    蒸饭的纱布
    ajax 笔记--不刷新实现简单的留言版 guestBook
    从表的第几条取到第几条记录
    在asp.net添加数据到XML里去
    ajax 笔记-- 写了一个不用刷新就能实现--用户名验证的例子
    今天生日
    ajax 笔记不用刷新实现数据的分页显示
  • 原文地址:https://www.cnblogs.com/timeship/p/2622297.html
Copyright © 2011-2022 走看看