快速排序和归并排序

来源:互联网 发布:淘宝手机端优惠券设置 编辑:程序博客网 时间:2024/05/30 20:07

快速排序和归并排序

  • 快速排序
  • 归并排序

阅读之前注意:

本文阅读建议用时:20min
本文阅读结构如下表:

项目 下属项目 测试用例数量 快速排序 无 1 归并排序 无 1

快速排序

快速排序(我们以升序为例)的关键在于:

  1. 把第一个值看做是枢纽值(pivot),利用两个坐标把这个枢纽值传到序列的合适位置,使得左边的值均比枢纽值小,右边的值均比枢纽值大
  2. 对枢纽值左边的序列(不包括枢纽值)做第一步的处理,对枢纽值右边的序列也做第一步的处理。直至被处理的序列只有一个数。
    参考以下代码:1
#include<stdio.h>#include<stdlib.h>void swap(int *a,int low,int high)//交换{    int tmp = a[low];    a[low] = a[high];    a[high] = tmp;}int partition(int *a,int low,int high)//寻找枢纽值{    while (low < high)    {        while ((low<high) && (a[low]<a[high]))            high--;        swap(a, low, high);        while ((low < high) && (a[low] < a[high]))            low++;        swap(a, low, high);    }    return low;//当low=high时,坐标即枢纽}void quickSort(int *a,int low,int high)//快速排序{    if (low >= high)        return;//退出条件    int pivot = partition(a, low, high);//第一步,寻找枢纽值    quickSort(a, low, pivot - 1);//对枢纽值左边的序列快速排序    quickSort(a, pivot + 1, high);//对枢纽值右边的序列快速排序}void main(){    int a[10] = { 1, 9, 5, 4, 2, 7, 8, 6, 3, 0 };    quickSort(a, 0, 9);    for (int i = 0; i < 10; i++)        printf("%d ", a[i]);    system("pause");}

归并排序

归并排序(我们以升序为例)的关键在于:

  1. 对整个序列等分,之后对左序列等分,对右序列等分,直至最后被等分的序列成为单个数。再从单个数开始不断归并(merge),归并后的序列是有序的,这样子的左序列和右序列再归并还是有序的。
    参考以下代码:
#include<stdio.h>#include<stdlib.h>void merge(int *des,int *src,int size,int low,int mid,int high)//归并{    int i = low;    int j = 0;    int k = 0;    j = mid + 1;    while ((low <= mid) && (j <= high))    {        if (src[low] < src[j])            des[i++] = src[low++];        else            des[i++] = src[j++];    }    while (low <= mid)        des[i++] = src[low++];    while (j <= high)        des[i++] = src[j++];}void sort(int *des, int *src, int size,int low,int high)//归并排序{    if (low == high)    {        des[low] = src[low];//重要        return;    }    int *space = (int *)malloc(size*sizeof(int));//开辟临时空间    int mid = (low + high) / 2;//等分    sort(space, src, size, low, mid);//对左序列归并排序    sort(space, src, size, mid + 1, high);//对有序列归并排序    merge(des, space, size, low, mid, high);//把左序列和右序列归并    free(space);}void main(){    int a[10] = { 1, 9, 4, 7, 3, 2, 5, 6, 0, 8 };    int b[10] = { 0 };    sort(b, a, 10, 0, 9);    for (int i = 0; i < 10; i++)        printf("%d ", b[i]);    system("pause");}

快速排序和归并排序其实都是分而治之,其中归并排序不仅需要化整为零,还需要化零为整。2

  • 快速排序和归并排序
      • 阅读之前注意
    • 快速排序
    • 归并排序


  1. 程序基于王保明先生的讲课内容. ↩
  2. 程序基于王保明先生的讲课内容. ↩
原创粉丝点击