快排不同实现

区别主要在于如何将大于和小于等于pt_value的元素分组
测试样例case
https://leetcode.cn/problems/sort-an-array/

1. 正常交换搬移

超时

class Solution {

    private void swap(int[] nums, int l, int r) {
        int t = nums[l];
        nums[l] = nums[r];
        nums[r]= t;
    }

    private void quickSort(int[] nums, int l, int r) {
        if (r <= l) {
            return;
        }
        
        int ptVal = nums[l];

        int lc = l;
        int rc = r;

        while (lc < rc) {
            
            while (nums[lc] <= ptVal && lc < r) {
                lc++;
            }

            while(nums[rc] > ptVal && l < rc) {
                rc--;
            }

            if (rc > lc) {
                swap(nums, lc, rc);
            }
        }

        swap(nums, rc, l);

        quickSort(nums, l, rc - 1);
        quickSort(nums, rc+1, r);
    }
   

    public int[] sortArray(int[] nums) {
        if (nums.length < 1) {
            return nums;
        }
        quickSort(nums, 0, nums.length - 1);
        return nums;
    }
}

2. 随机pt

执行用时分布
2020ms 击败8.93%使用 Java 的用户

class Solution {

    private void swap(int[] nums, int l, int r) {
        int t = nums[l];
        nums[l] = nums[r];
        nums[r]= t;
    }

    private void quickSort(int[] nums, int l, int r) {
        if (r <= l) {
            return;
        }
        
        int rand = new Random().nextInt(r - l + 1);
        swap(nums, l, l+rand);
        int ptVal = nums[l];

        int lc = l;
        int rc = r;

        while (lc < rc) {
            
            while (nums[lc] <= ptVal && lc < r) {
                lc++;
            }

            while(nums[rc] > ptVal && l < rc) {
                rc--;
            }

            if (rc > lc) {
                swap(nums, lc, rc);
            }
        }

        swap(nums, rc, l);

        quickSort(nums, l, rc - 1);
        quickSort(nums, rc+1, r);
    }
   

    public int[] sortArray(int[] nums) {
        if (nums.length < 1) {
            return nums;
        }
        quickSort(nums, 0, nums.length - 1);
        return nums;
    }
}

3. 三指针

执行用时分布
1015
ms
击败
32.07%
使用 Java 的用户

class Solution {

    private void swap(int[] nums, int l, int r) {
        int t = nums[l];
        nums[l] = nums[r];
        nums[r]= t;
    }

    private void quickSort(int[] nums, int l, int r) {
        if (r <= l) {
            return;
        }
        
        // 小于区间右边界
        int i = l;
        // 大于区间左边界
        int rl = r + 1;
        // 指针
        int cursor = l + 1;
        int selVal = nums[l];

        while (cursor < rl) {
            if (nums[cursor] > selVal) {
                rl -= 1;
                swap(nums, rl, cursor);
            } else if (nums[cursor] < selVal){
                swap(nums, i+1, cursor);
                cursor += 1;                
                i += 1;
            } else {
                cursor+=1;
            }
        }
        swap(nums, i, l);

        quickSort(nums, l, i-1);
        quickSort(nums, rl, r);
    }
   

    public int[] sortArray(int[] nums) {
        if (nums.length < 1) {
            return nums;
        }
        quickSort(nums, 0, nums.length - 1);
        return nums;
    }
}

链表快排

链表快排1

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {


    private ListNode quickSort( ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newH = partion(head);
        ListNode next = head.next;
        head.next = null;
        ListNode l = quickSort(newH);
        ListNode r = quickSort(next);
        return merge(l, r);
    }

    private ListNode merge(ListNode l1, ListNode l2) {
       ListNode p = l1;
       while (p.next != null) {
        p = p.next;
       }
       p.next = l2;
       return l1;
    }

    private ListNode partion( ListNode next) {
        if (next == null || next.next == null) {
            return next;
        }
        ListNode pt = next;
        int ptVal = pt.val;
        ListNode cursor = next.next;
        next.next = null;

        ListNode left = new ListNode();
        ListNode ll = left;
        ListNode right = new ListNode();
        ListNode rr = right;
        while (cursor != null) {
            if (cursor.val < ptVal) {
                left.next = cursor;
                left = left.next;
            } else {
                right.next = cursor;
                right = right.next;
            }
            ListNode t = cursor.next;
            cursor.next = null;
            cursor = t;
        }
        
        left.next = pt;
        pt.next = rr.next;
       
        return ll.next;
    }

    public ListNode sortList(ListNode head) {
        return quickSort(head);
    }
}

链表快排2

class Solution {


     private void quickSort(ListNode head, ListNode prev, ListNode after) {
        if (head == after || head.next == after) {
            return;
        }
        ListNode left = partition(head, prev, after);
        quickSort(prev.next, prev, head);        
        quickSort(head.next, head, after);
    }

    private ListNode partition(ListNode head, ListNode prev, ListNode after) {
        if (head == null || head.next == null) {
            return null;
        }

        int ptVal = head.val;
        ListNode right = new ListNode();
        ListNode left = prev;
        ListNode cursor = head;
        while (cursor != after) {
            ListNode t = cursor.next;
            if (cursor.val >= ptVal) {
                right.next = cursor;
                right = right.next;
            } else {
                left.next = cursor;
                left = left.next;
            }
            cursor.next = null;
            cursor = t;
        }
        right.next = after;
        left.next = head;
        return (left == prev) ? null : left;
    }


    public ListNode sortList(ListNode head) {
        ListNode vir = new ListNode();
        vir.next = head;
        quickSort(head, vir, null);
        return vir.next;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python 中的快速排序算法可以使用内置的 `sorted()` 函数实现,例如: ``` numbers = [5, 2, 9, 1, 5, 6] sorted_numbers = sorted(numbers) print(sorted_numbers) # Output: [1, 2, 5, 5, 6, 9] ``` 你也可以使用自定义的比较函数来控制排序的方式,例如: ``` numbers = [5, 2, 9, 1, 5, 6] sorted_numbers = sorted(numbers, key=lambda x: -x) print(sorted_numbers) # Output: [9, 6, 5, 5, 2, 1] ``` 如果你想手动实现快排算法,可以使用以下代码: ``` def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) numbers = [5, 2, 9, 1, 5, 6] sorted_numbers = quick_sort(numbers) print(sorted_numbers) # Output: [1, 2, 5, 5, 6, 9] ``` 希望这对你有帮助! ### 回答2: 快速排序是一种高效的排序算法,它的核心思想是分治法。具体实现快排的步骤如下: 1. 选择一个基准元素,将待排序序列分为两部分,左边的元素小于基准元素,右边的元素大于基准元素。 2. 对左右两个子序列递归地进行快速排序。 3. 当子序列长度小于等于1时,递归结束,排序完成。 以下是用Python实现快速排序的代码: def quick_sort(arr): if len(arr) <= 1: # 当序列长度小于等于1时,直接返回 return arr pivot = arr[len(arr) // 2] # 选择基准元素,可以选择任意位置的元素 left = [x for x in arr if x < pivot] # 将小于基准元素的元素放在左边 middle = [x for x in arr if x == pivot] # 将等于基准元素的元素放在中间 right = [x for x in arr if x > pivot] # 将大于基准元素的元素放在右边 return quick_sort(left) + middle + quick_sort(right) # 递归地对左右两个子序列进行快速排序 arr = [5, 3, 8, 6, 2, 7, 1, 4] sorted_arr = quick_sort(arr) print(sorted_arr) 以上代码首先定义了一个快速排序的函数`quick_sort`,它接收一个待排序的列表作为参数,并返回排序后的新列表。在`quick_sort`函数内部,通过递归的方式不断对左右子序列进行快速排序,最终将排序完成的左子序列、中间元素和右子序列拼接在一起返回。 对于输入列表`arr = [5, 3, 8, 6, 2, 7, 1, 4]`,经过快速排序后,输出为`[1, 2, 3, 4, 5, 6, 7, 8]`。 ### 回答3: 快速排序(Quick Sort)是一种高效的排序算法,其基本思想是通过分治法将数组分成两个子数组,并通过递归地排序子数组,最终得到完全有序的数组。 在Python中,可以通过以下代码实现快速排序: ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] # 选择数组中间的元素作为基准值 less, equal, greater = [], [], [] # 分别用来存放小于、等于和大于基准值的元素 for num in arr: if num < pivot: less.append(num) elif num == pivot: equal.append(num) else: greater.append(num) return quick_sort(less) + equal + quick_sort(greater) # 递归地对小于和大于基准值的两个子数组进行排序,并将结果连接起来 ``` 在上述代码中,我们首先判断数组的长度是否小于等于1,如果是,则直接返回。然后选择数组中间的元素作为基准值(pivot)。接下来,通过循环遍历整个数组,将小于、等于和大于基准值的元素分别放入三个不同的数组(less、equal、greater)中。最后,递归地对小于和大于基准值的两个子数组进行排序,并将结果连接起来,得到最终的有序数组。 快速排序的平均时间复杂度为O(nlogn),在最坏情况下为O(n^2),空间复杂度为O(logn)。由于快速排序是一种原地排序算法,所以不需要额外的空间进行排序。快速排序的优势在于其递归的特性,使得其在实现上比较简单且易于理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值