• 快速排序


    快速排序的基本思想为分治法。通过不断的划分,以及对子数组的排序,来实现对整个数组的排序。归并排序也是分治法的思想,相反的,归并是将小的数组不断的合并来实现排序。

     void quicksort(int data[], int left, int right)
    {
        if(left >= right)//当数组中的个数为0时,什么也不做
            return;
        int pivot = data[left];//取第一个数作为基准
        int i = left;
        int j = right;
    //1. divide: 以pivot为基准,将数组划分成两个部分,左边的数<= pivot <= 右边的数
    while(i < j) {
    //划分的时候,先移动右边的指针
    while(data[j] >= pivot && j >= i) j--; if(i < j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; } while(data[i] <= pivot && i <= j) i++; if(i < j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; } }
    //2. conquer: 对两个子数组进行递归排序 quicksort(data, left, i); quicksort(data, i
    + 1, right); }

    注:当以左边第一个元素为pivot,在划分数组时,先移动右边的指针

    对 data = [ 1 0 4 ]进行排序,pivot = 1, i = 0, j = 2

    假如先移动i = 0,因为data[0]=1和data[1]=0都小于等于pivot = 1,所以i向后移动两个位置变成2。接下来移动j=2(指向最后一个数),因为 data[2] > pivot = 1且data[1] = 0 < pivot = 1,所以j只能向左移动一个位置变成 1。因为2 = i > j = 1,不进行交换。循环的结果仍然为[1 0 4]。

    相反的,先移动j,j = 1,data[j] < pivot,交换得到[0 1 4]。移动i,得到i = 2,j = 1,不交换。循环的结果[为0 1 4]。

  • 相关阅读:
    11g SPA (sql Performance Analyze) 进行升级测试
    SPA游标采集之去除重复
    C++ 实现分数的四则运算
    计算两个数的最大公约数和最小公倍数(欧几里得算法)
    计算a月的第b个星期c
    完数问题
    求整数的最大质因子
    C++ 读取文本文件内容到结构体数组中并排序
    月饼问题PAT B1020(贪心算法)
    路径打印(set以及字符串的相关操作)
  • 原文地址:https://www.cnblogs.com/coolqiyu/p/4971074.html
Copyright © 2020-2023  润新知