快速排序

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


快速排序(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>";

参考来源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值