当前位置: 首页 > news >正文

vip影视建设网站官网邢台网站制作市场

vip影视建设网站官网,邢台网站制作市场,自己建的网站地址,无锡制作网站公司哪家好快速排序 算法思想 每一轮在数组相应的范围上随机找一个元素进行划分,将不大于它的所有元素都放到左边,将大于它的元素都放到右边。在左右两个子数组上不断地递归,直到整个数组上有序。 注意:实现时选择的时参考荷兰国旗问题优化…

快速排序

算法思想

每一轮在数组相应的范围上随机找一个元素进行划分,将不大于它的所有元素都放到左边,将大于它的元素都放到右边。在左右两个子数组上不断地递归,直到整个数组上有序。
注意:实现时选择的时参考荷兰国旗问题优化后的快排算法,它会在一次划分中维护一个包含所有等于划分标准元素的区间,保证小于该数的都在区间左侧,大于该数的都在区间右侧。这样的做法,在一定程度上能够减少划分次数。

稳定性分析

快速排序是不稳定的,它涉及到拆分区间,无法保证相等的数一定在同一个区间上被处理完成,也就无法保证它们的相对次序不发生变化。

具体实现

// 交换数组中的两个元素
private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}// 全局变量 first 表示等于当前元素的第一个下标位置,last 表示最后一个
public static int first, last;private void quickSort(int[] arr, int left, int right) {// 无法构成区间,直接返回if (left >= right) {return;}// 在合法范围内随机一个元素作为划分标准int pivot = arr[left + (int) (Math.random() * (right - left + 1))];// 划分并递归处理左右子数组partition(arr, left, right, pivot);quickSort(arr, left, first - 1);quickSort(arr, last + 1, right);
}public void partition(int[] arr, int left, int right, int pivot) {first = left;last = right;int cur = left;while (cur <= last) {if (arr[cur] == pivot) {cur++; // 当前元素等于划分标准,不作处理并后移指针} else if (arr[cur] < pivot) {swap(arr, first++, cur++); // 小于划分标准,交换且分别后移两个指针} else {swap(arr, cur, last--); // 大于划分标准,交换并前移记录最后一个当前元素的指针}}
}

随机选择

算法思想

随机选择是基于快排的划分操作,能够快速地确定一个数在数组中排序后的理论位置。这部分内容其实和排序关系不大,但是与快排有很大的关联,可以放在一起整理。

实践案例:Leetcode 215. 数组中的第K个最大元素

class Solution {public int findKthLargest(int[] nums, int k) {return randomizedSelect(nums, nums.length - k);}// 全局变量 first 表示等于当前元素的第一个下标位置,last 表示最后一个public static int first, last;public int randomizedSelect(int[] arr, int cur) {int res = 0;for (int left = 0, right = arr.length - 1; left <= right;) {partition(arr, left, right, arr[left + (int) (Math.random() * (right - left + 1))]);if (cur < first) {right = first - 1;  // 当前下标小于维护的第一个下标,到左边区间中找} else if (cur > last) {left = last + 1; // 当前下标大于维护的最后一个下标,到右边区间中找} else {res = arr[cur]; // 当前下标在维护的范围内,记录结果break;}}return res;}// 交换数组中的两个元素private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public void partition(int[] arr, int left, int right, int pivot) {first = left;last = right;int cur = left;while (cur <= last) {if (arr[cur] == pivot) {cur++; // 当前元素等于划分标准,不作处理并后移指针} else if (arr[cur] < pivot) {swap(arr, first++, cur++); // 小于划分标准,交换且分别后移两个指针} else {swap(arr, cur, last--); // 大于划分标准,交换并前移记录最后一个当前元素的指针}}}
}

梳理总结

快速排序的理论复杂度是 O ( N l o g N ) O(NlogN) O(NlogN),它通过划分来不断减小问题规模从而快速解决问题。但是实践中存在能使快排退化到 O ( N 2 ) O(N ^ 2) O(N2) 的阴间待排序列,因此需要通过随机划分标准这个手段来让时间复杂度尽可能地稳定在 O ( N l o g N ) O(NlogN) O(NlogN)
随机选择算法,本质上是根据不同的标准,维护相应的数值区间。它能够在理论实践复杂度 O ( N ) O(N) O(N) 且不需要额外空间的情况下找出数组中第 K K K 大的数。

后记

使用 Leetcode 912. 排序数组 进行测试,随机快速排序能够比较高效地完成任务。
实际运行下来和归并排序之间都有一些差距,猜测原因是随机操作的耗时很大,并且 Leetcode 平台上专门设置了卡快排的用例。

http://www.yayakq.cn/news/892279/

相关文章:

  • wordpress调用分类标题seo是什么意思中文翻译
  • 汕头网站建设方案维护甘肃一建考试最新消息
  • 做石油期货看什么网站网站开发需要的资源
  • 网站开发的3个阶段建站seo是什么
  • 低价机票 网站建设怎么建设国外免费网站
  • 游戏开发和网站开发哪个好玩wordpress分类目录导航
  • wordpress分类链接选一个网站做seo
  • 网站建设知名公司排名菏泽网站网站建设
  • 民治做网站多少钱网站开发湛江
  • 湛江网站建设外包辽阳低价网站建设公司
  • 化州市住房和建设局网站广州制作外贸网站公司简介
  • 男生为女生做网站哪个网站做logo
  • 长春做网站新格公司做文案策划有些网站
  • 称心的赣州网站建设广州工程交易服务中心
  • phpstorm做网站响应式网站建设智能优化
  • 专业建站团队asp.ne手机触摸网站开发
  • 合肥建设管理学校网站三个律师做网站合适吗
  • 北京市中交建设有限公司网站邮箱如何注册企业邮箱
  • 网站解析一般什么时候濮阳网站建设推广
  • 自己电脑做网站服务器小工具东坑镇仿做网站
  • 高新技术企业申报网站关键词优化怎么弄
  • 做网站备案好还是不备案好wordpress 4.5 安装失败
  • html 创意网站目前国内有哪些网站做家具回收
  • 南京做征信服务的公司网站中国最有名的网站建设公司
  • 贵阳企业免费建站公路建设项目可行性研究报告编制办法哪个网站查最新版
  • 建立网站需要哪几个白云区建材网站建设推广
  • 高端手机网站建设需要多少钱教学网站前台er图
  • 怎样建立自己网站多少钱石家庄业之峰装饰公司怎么样
  • 网站速度clef wordpress
  • 深圳网站建设网做课件可赚钱的网站