• 数据结构——排序——快排序算法


    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来。

     使用快速排序法对一列数字进行排序的过程

    算法原理

    快速排序采用一种“分而治之、各个击破”的观念。

    快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

    步骤为:

    1、从数列中挑出一个元素,称为 "基准"(pivot),

    2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

    3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

    #include <stdio.h>
    #include <stddef.h>
    void swap(int * a, int * b)  //交换函数
    {  
        int tmp = * a;
        * a = * b;
        * b = tmp;
    }
    void printArray(int a[], int count)   //打印数组元素
    {
        int i;
        for(i = 0; i < count; i++)
            printf("%d ",a[i]);
        printf("
    ");
    }
    size_t partition(int * ary, size_t len, size_t pivot_i) //划分函数
    {   
        size_t i = 0;
        size_t small_len = 0;
        int pivot = ary[pivot_i];
        swap(&ary[pivot_i], &ary[len - 1]);
         for (; i < len; i++) {
              if (ary[i] < pivot) {
                swap(&ary[i], &ary[small_len]);
                  small_len++;
            }
        }
        swap(&ary[len - 1], &ary[small_len]); //交换元素
        return small_len;
    }
    void quick_sort(int * ary, size_t len) 
    {
        if (len == 0 || len == 1) return;
        size_t small_len = partition(ary, len, 0);
        quick_sort(ary, small_len);
        quick_sort(&ary[small_len + 1], len - small_len - 1);
    }
    int main(void) 
    {
        int ary[] = {2, 4, 12, 25, 13, 5, 3, 1, 7, 6};
        size_t len = sizeof(ary) / sizeof(ary[0]);
        printArray(ary, len);
        quick_sort(ary, len);
        printArray(ary, len);
        return 0;
    }

    C89标准在stdlib.h中定义了抽象数据类型的快速排序函数qsort:

    #include <stdio.h>
    #include <stdlib.h>
    static int cmp(const void *a,  const void *b)
    {
        return *(int *)a - *(int *)b;
    }
    void printArray(int a[], int count)   //打印数组元素
    {
        int i;
        for(i = 0; i < count; i++)
            printf("%d ",a[i]);
        printf("
    ");
    }
    int main()
    {
        int arr[10] = {5, 3, 7, 4, 1, 9, 8, 6, 2};
        size_t len = sizeof(arr) / sizeof(arr[0]);
        printArray(arr, len);
        qsort(arr, 10, sizeof(int), cmp);
        printArray(arr, len);
        return 0;
    }

    未完· · ·

    http://www.cnblogs.com/archimedes/p/quick-sort-algorithm.html

  • 相关阅读:
    开源分布式任务调度工具,和你一起记住生命中每一个重要的时刻
    寒假学习进度
    寒假学习进度
    寒假学习进度
    寒假学习进度
    js第三个阶段的面试题
    vue3保证你看懂watch和watchEffect的详细详细使用
    VMtool 安装与使用
    PHP 远程 debug
    一些有趣的编程名言
  • 原文地址:https://www.cnblogs.com/qq1129496211/p/4047123.html
Copyright © 2020-2023  润新知