美文网首页
2020-03-23

2020-03-23

作者: 木马音响积木 | 来源:发表于2020-03-23 09:20 被阅读0次

针对快速排序,双指针中有快慢指针法,和左右夹逼法。
快慢指针法,写法相对容易,不容易出错,而左右夹逼,写法的注意事项较多;
https://blog.csdn.net/qq_34557770/article/details/100690849
我感觉,他写的很好,针对swap ,由于python 一行就搞定了,而且还没有先后顺序,python 就不要再用个swap函数了。毕竟函数调用,压栈弹栈,也需要开销。
我一般习惯用最右边元素做基准,因为pyton range是左闭右开的;

#c 
public class QuickSort {
    public void quickSort(int[] nums, int left, int right) {
        if (left < right) {
            int partition = partition(nums, left, right);
            quickSort(nums, left, partition - 1);
            quickSort(nums, partition + 1, right);
        }
    }
 
    public int partition(int[] nums, int left, int right) {
        int start = left;
        int end = right;
        int target = nums[right];
        while (start < end) {
            while (start < end && nums[start] < target) {// it is  not <=
                start++;
            }
            while (start < end && nums[end] >= target) {
                end--;
            }
            swap(nums, start, end);
        }
        swap(nums, right, start);
        return start;
    }
 
    private void swap(int[] nums, int start, int end) {
        int temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
    }
}

#原文链接:https://blog.csdn.net/qq_34557770/article/details/100690849

再看看,这个的解法,左边为基准的
https://www.jianshu.com/p/2b2f1f79984e

def quick_sort(L):
    return q_sort(L, 0, len(L) - 1)

def q_sort(L, left, right):
    if left < right:
        pivot = Partition(L, left, right)

        q_sort(L, left, pivot - 1)
        q_sort(L, pivot + 1, right)
    return L

def Partition(L, left, right):
    pivotkey = L[left]

    while left < right:
        while left < right and L[right] >= pivotkey:
            right -= 1
        L[left] = L[right]
        while left < right and L[left] <= pivotkey:
            left += 1
        L[right] = L[left]

    L[left] = pivotkey
    return left

L = [5, 9, 1, 11, 6, 7, 2, 4]

print quick_sort(L)

针对分区函数

def pp(arr,left,r):
    temp=r
    key=arr[r]
    slow=left
    for fast in range(left,r):
        if arr[fast]<=key:
            arr[fast],arr[slow]=arr[slow],arr[fast]
            slow+=1
    arr[slow],arr[temp]=arr[temp],arr[slow]
    return slow

完整代码如下

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
def quick_sort(L):
    return q_sort(L, 0, len(L) - 1)

def q_sort(L, left, right):
    if left < right:
        pivot = Partition(L, left, right)

        q_sort(L, left, pivot - 1)
        q_sort(L, pivot + 1, right)
    return L


def Partition(arr, left, r):
    temp=r
    key=arr[r]
    slow=left
    for fast in range(left,r):
        if arr[fast]<=key:
            arr[fast],arr[slow]=arr[slow],arr[fast]
            slow+=1
    arr[slow],arr[temp]=arr[temp],arr[slow]
    return slow
L = [4,3,6,4,4,4,5, 9, 1, 11, 6,555, 7, 2, 4,4,4,4,4]

print (quick_sort(L))
def quick_sort(array, l, r):
    if l < r:
        q = partition(array, l, r)
        quick_sort(array, l, q - 1)
        quick_sort(array, q + 1, r)

def partition(array, l, r):
    x = array[r]
    i = l - 1
    for j in range(l, r):
        if array[j] <= x:
            i += 1
            array[i], array[j] = array[j], array[i]
    array[i + 1], array[r] = array[r], array[i+1]
    return i + 1

各种写法,从中可以看出,同是O(n)级别的函数,执行效率之间的差异。

相关文章

网友评论

      本文标题:2020-03-23

      本文链接:https://www.haomeiwen.com/subject/lpriyhtx.html