快速排序

来源:互联网 发布:大数据量 数据库 编辑:程序博客网 时间:2024/06/18 15:16

今天搞了一下午的快速排序。。。对于自己这个学渣真的是没什么说的
整理一下,方便以后复习回顾。有什么错误和改进欢迎大家指出,不胜感激!!!


快速排序(Quicksort),又称划分交换排序(partition-exchange sort),快速排序采用了分治策略(分治法的基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。)利用分治法可将快速排序的分为三步:1.在数据集之中,选择一个元素作为”基准”(pivot)。2.所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。3.对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

图片来自维基百科

时间复杂度
最优时间复杂度 Ο(n log n)
最坏时间复杂度 Ο(n2)
平均时间复杂度 Ο(n log n)

空间复杂度 根据实现的方式不同而不同

其划分过程如图:
快排的划分过程


C语言实现代码如下:

int Partition(int *arr, int low, int high){    if (arr == NULL && low > high)    {        printf("input error");    }    int tmp = arr[low];            while (low < high)    {        while (low < high && tmp <= arr[high])        {            high--;        }        arr[low] = arr[high];        while (low <high && tmp >= arr[low])        {            low++;        }        arr[high] = arr[low];    }    arr[low] = tmp;    return low;}void QuickSort(int *arr, int low, int high){    if (low == high)      {        return ;    }    int par = Partition(arr, low, high);    if (low < high)    {        Partition(arr, low, par-1);        Partition(arr, par+1, high);    }}

JAVA方法:

class quick_sort {    int[] arr;    private void swap(int x, int y) {        int temp = arr[x];        arr[x] = arr[y];        arr[y] = temp;    }    private void quick_sort_recursive(int start, int end) {        if (start >= end)            return;        int mid = arr[end];        int left = start, right = end - 1;        while (left < right) {            while (arr[left] <= mid && left < right)                left++;            while (arr[right] >= mid && left < right)                right--;            swap(left, right);        }        if (arr[left] >= arr[end])            swap(left, end);        else            left++;        quick_sort_recursive(start, left - 1);        quick_sort_recursive(left + 1, end);    }    public void sort(int[] arrin) {        arr = arrin;        quick_sort_recursive(0, arr.length - 1);    }}

JavaScript方法:

Array.prototype.quick_sort = function() {    var len = this.length;    if (len <= 1)        return this.slice(0);    var left = [];    var right = [];    var mid = [this[0]];    for (var i = 1; i < len; i++)        if (this[i] < mid[0])            left.push(this[i]);        else            right.push(this[i]);    return left.quick_sort().concat(mid.concat(right.quick_sort()));};var arr = [5, 3, 7, 4, 1, 9, 8, 6, 2];arr = arr.quick_sort();for (i = 0; i < arr.length; i++)    document.body.innerHTML += arr[i] + " ";document.body.innerHTML += "<br>";

参考来源

  • 维基百科
  • 常见排序算法 - 快速排序 (Quick Sort)
  • JAVA实现快速排序
  • 快速排序(小程序 大思想)
  • 经典排序算法设计与分析
0 0
原创粉丝点击