分治法实例(快排)

分治法思想

分治法的精髓

  1. 分–将问题分解为规模更小的子问题;
  2. 治–将这些规模更小的子问题逐个击破;
  3. 合–将已解决的子问题合并,最终得出“母”问题的解;

快排

快速排序原理:从一组数中选出一个pivot(中心轴),将大于它的数放右边,小于它的数放左边,然后再从左边和右边的俩组数中分别执行此操作,此时,数组就是有序的了。

//
// Created by a1073 on 2019/7/4.
//

#include 

void quickSort(int[], int, int);

int main(void) {
    int array[6] = {1, 9, 4, 6, 3, 2};
    quickSort(array, 0, 5);
    for (int i = 0; i < 6; ++i) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    return 0;
}

void quickSort(int array[], int left, int right) {
    int i = left;
    int j = right;
    int temp;
    int pivot; //中心轴

    pivot = array[(i + j) / 2];

    while (i <= j) {
        while (array[i] < pivot) {
            /*
             * 向右搜索比pivot值大数据*/
            i++;
        }
        while (array[j] > pivot) {
            /*
             * 向左搜索比pivot值小的数据*/
            j--;
        }
        if (i <= j) {
            /*
             * if的判断条件与while的循环条件不重复
             * while的判断条件仅仅是控制循环次数
             * 而if中的判断——是否执行互换的条件
             * 如果i>j的话代表此次的循环结束*/

            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }
    /*
     * 此刻i在j的右边
     * 必须进行判断才能进行递归
     * 否则在到最后无法停止递归
     * */
    if(j > left){
        quickSort(array, left, j);
    }

    if(i < right){
        quickSort(array, i, right);
    }
}

千万注意最后的结束条件!!!

你可能感兴趣的:(c)