快速排序

来源:互联网 发布:webshell采集工具 编辑:程序博客网 时间:2024/06/08 17:17

快速排序的基本思想:快速排序采用了分治的策略,将问题分解为若干规模更小但结构与原问题相似的子问题。递归的求解子问题最终将子问题的解组合为原问题的解。
1) 分划。
2) 求解。
3) 组合。

#include<stdio.h>#include<stdlib.h>int Partition(int *array, int i, int j) {    int t = *(array + i);    while (i < j) {        while (i < j && *(array + j) >= t)            j--;        if (i < j) {            *(array + i) = *(array + j); // 相当于 交换array[i]和array[j]            i++;        }        while (i < j && *(array + i) <= t)            i++;        if (i < j) {            *(array + j) = *(array + i);            j--;        }    }    *(array + i) = t;    return i;}void QuickSort(int *array, int low, int high) {    int mid;    if (low < high) {        mid = Partition(array, low, high);        QuickSort(array, low, mid - 1);        QuickSort(array, mid + 1, high);    }}void main() {    int i, n;    int array[255];    printf("输入数据个数:");    scanf("%d", &n);    if (n <= 0 || n > 255) {        printf("n is not correct!\n");        exit(1);    }    printf("输入待排序的数据:\n");    for (i = 1; i <= n; i++) {        scanf("%d", (array + i));    }    printf("\n待排序的数组为:\n");    for (i = 1; i <= n; i++) {        printf("%d ", *(array + i));    }    QuickSort(array, 1, n);    printf("\n\n快速排序后的数组:\n");    for (i = 1; i <= n; i++) {        printf("%d ", *(array + i));    }    printf("\n\n");}

分划的基本流程:无序序列为Array[low..high],初始时设置两个指针i、j,并令i=low,j=high。选取Array[i]即Array[low]为基准数据,将其保存到变量t中。令j从high起向左扫描,找到第一个比t小的数Array[j],将Array[j]移至i所指的位置上,使小于t的那个数移到基准的左边,然后令i指针从i+1位置开始向右扫描,直到找到第一个比t大的数Array[i],将Array[i]移至i所指的位置上,使大于t的那个数移到基准的右边;接着令指针j自j-1处向左扫描,如此交替扫描方向,直到i=j; i便是基准的最终位置,将t放在此位置就完成了一次划分。

时间复杂度:主要时间耗费在划分操作上。最坏时间为O(n^2),最好时间为O(nlog_2Q),就平均性而言,他是基于关键字比较的内部排序算法中速度最快的,快速排序的名字也是由此而来的。平均时间复杂度为O(nlog_2n)。
空间复杂度:快速排序在系统内部需要一个栈来实现递归,若每次划分较为均匀,则其递归树高度为O(log_2n),故递归后所需的栈空间为O(log_2n)。最坏情况下,递归树高度为O(n),所需的栈空间为O(n)。
稳定性:快速排序是不稳定的。

0 0
原创粉丝点击