算法思想-快排

思路

  • 首先在数组中选一个数作为基准,通常为数组第一个数
  • 指针 i,j 分别指向数组第一个元素和最后一个元素。从 j 向左开始遍历,找到比基准小的数,将指针j对应的数赋值给指针i所在的位置,i++。交换,从i开始向右遍历,找到比基准大的数,将指针i对于的数赋值给指针j所在的位置,j–。不断重复以上步骤,知道 i、j 相遇。再将基准的值赋给指针 i、j 所在的位置。第一轮快排结束,基准左侧的数都小于等于基准,右侧的数都大于等于基准
  • 将数组以基准为界限,划分成两个子数组。重复以上快排步骤。直到子数组的长度为1,快排结束。

相关题解

  • 5000 个数里选择 Top500

时间复杂度 O(n)
目的:找到下标为 499 的基准,这样,左边的数就都比基准大(快排思路中大小交换)

  • 一个整型数组,有负数,0 ,正数,找重复次数最多的数。可能存在重复次数相同的数,返回其中一个即可

快排,用两个个变量记录 出现次数最多的数 和 其出现次数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于快排思想的选择算法(QuickSelect)是一种寻找无序数组中第 k 小(或第 k 大)元素的算法。其基本思想是:快速排序每次将数组分为两个部分,左边部分小于等于右边部分,因此我们可以利用这一特性来寻找第 k 小元素。 以下是基于快排思想的选择算法的Java实现: ``` public static int quickSelect(int[] arr, int k) { int left = 0; int right = arr.length - 1; while (left <= right) { int pivotIndex = partition(arr, left, right); if (pivotIndex == k - 1) { return arr[pivotIndex]; } else if (pivotIndex < k - 1) { left = pivotIndex + 1; } else { right = pivotIndex - 1; } } return -1; // 表示未找到第 k 小元素 } private static int partition(int[] arr, int left, int right) { int pivot = arr[left]; int i = left + 1; int j = right; while (i <= j) { if (arr[i] <= pivot) { i++; } else if (arr[j] > pivot) { j--; } else { swap(arr, i++, j--); } } swap(arr, left, j); return j; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } ``` 在上述代码中,我们定义了一个 `quickSelect` 方法,该方法接收两个参数,一个是无序数组 `arr`,另一个是第 k 小元素的位置 `k`。首先,我们定义两个指针 `left` 和 `right`,分别指向数组的左端和右端。然后,我们进入循环,每次调用 `partition` 方法将数组分为两个部分,并返回枢轴元素的下标 `pivotIndex`。如果 `pivotIndex` 等于 `k - 1`,则找到了第 k 小元素,返回其值;如果 `pivotIndex` 小于 `k - 1`,则第 k 小元素在枢轴元素的右侧,将 `left` 指针指向 `pivotIndex + 1`;如果 `pivotIndex` 大于 `k - 1`,则第 k 小元素在枢轴元素的左侧,将 `right` 指针指向 `pivotIndex - 1`。最后,如果循环结束仍未找到第 k 小元素,则返回 `-1`。 在 `quickSelect` 方法中,我们调用了 `partition` 方法,将数组分为两个部分。`partition` 方法的实现与快速排序类似,首先选定一个枢轴元素 `pivot`(这里我们选取数组的左端元素),然后定义两个指针 `i` 和 `j`,分别指向数组的左右两端。循环中,我们将 `i` 指针向右移动,直到找到第一个大于枢轴元素的元素;将 `j` 指针向左移动,直到找到第一个小于等于枢轴元素的元素;然后交换 `i` 和 `j` 指向的元素,使得左侧元素小于等于枢轴元素,右侧元素大于枢轴元素。重复以上步骤,直到 `i` 指针超过 `j` 指针,此时将枢轴元素与 `j` 指针指向的元素交换位置,使得枢轴元素左侧元素小于等于它,右侧元素大于它,然后返回 `j` 的值作为枢轴元素的下标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值