快速排序+归并排序

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

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/

 

你可能感兴趣的:(快速排序)