快速排序+归并排序

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

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/

 

posted @ 2012-08-03 21:42  时光旅行的懒猫  阅读(269)  评论(0编辑  收藏  举报