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

做漫画的网站有哪些网上电商平台开发

做漫画的网站有哪些,网上电商平台开发,绍兴网站建设公司哪家专业,WordPress中文相册1. 简介 传统快速排序用的是双路快速排序,即将大于基准值的部分放到基准值右侧,小于基准值的部分放到基准值左侧,但是这种算法面对过多的重复数据的数组,时间复杂度会增多,于是就有了三路快速排序的思想,其…

1. 简介

传统快速排序用的是双路快速排序,即将大于基准值的部分放到基准值右侧,小于基准值的部分放到基准值左侧,但是这种算法面对过多的重复数据的数组,时间复杂度会增多,于是就有了三路快速排序的思想,其想法是将数组分为三个区间,假设选择数组的首元素作基准值e,则小于基准值e的数组放到基准值的左侧,等于基准值e的放到中间,大于基准值e的放到右边,即下图所示。

2. 思路

我们用i做循环遍历,遍历整个数组,我们选择数组的第一个元素做基准值e,如下图

left指针代表当前搜索区间的开始下标;
right指针代表当前搜索区间的结束下标;
lt(less than)指针代表小于e的区间的结束下标;
gt(greater than)代表大于e的区间的开始下标;
i指针指向当前待处理的元素;

记数组为nums,我们分三种情况讨论该算法,设当前nums[i]为x
(1)x和基准值e相等:
i直接向后移动1位,当前元素自动划分到等于e的区间

(2)x小于基准值e:
nums[lt+1]和nums[i]互换,并且lt和i都向前移动一位,此次互换,之前的数组都已经排好,左侧的都遍历过了,小于e的区间的元素都严格小于e,,而nums[lt+1]在交换前,是等于e区间的,所以和nums[i]互换后,nums[i]就是e,所以直接i自增1移动,因为交换后的nums[i]已经是等于e,所以向后移动,此时交换后,nums[lt+1]一定是严格小于e,所以小于e的区间的结束下标lt指针也得向后移动1个位置。

(3)x大于基准值e:
nums[gt-1]和nums[i]互换,gt向前移动1位,此时i不向前移动,因为交换过来的到底是大于基准值还是小于基准值还需要等待下次循环再判断,但是交换后nums[gt-1]已经是大于基准值e且gt是大于e的区间的开始指针,所以gt要减1来向前移动1位,这样也保证了遍历到最后,nums[i]如果还是大于e,最后nums[i]与首元素交换的时候就不合理了。

最后(i == gt的时候跳出循环),i会在等于e的区间的最后,我们要把nums[i]与nums[left]互换,使得等于e的区间里的元素全是重复的e,情况(3)中已经保证nums[i]不会大于e,情况(1)也保证nums[i]不会等于e
经过一趟三路快速排序的划分后,和传统的双路快速排序类似,我们要分别在小于e和大于e的区间上继续进行三路快速排序的划分

3. 代码实现(C语言)

思路在注释中

//生成从x到y的整数随机数
int getIntRandom(int x, int y)
{// 传入时间戳,生成伪随机数srand((unsigned int)time(NULL));return (int)(x + (rand() % (y - x + 1)));
}
//三路快速排序,返回lt(小于e的区间的结束下标)和gt(大于e的区间的开始下标)
//以长度为2的数组的形式返回lt和gt
void divide3(int* nums, int left, int right)
{//left超过right,递归结束if (left >= right) {return;}//随机选择一个下标做基准值的元素的下标(不做随机化处理,不能过长度很长的测试用例)int rand_index = getIntRandom(left, right);printf("%d\n", rand_index);//基准值int pivot = nums[rand_index];//交换元素用的临时遍历int temp = 0;//交换nums[rand_index]与nums[left],为了方便下面的交换//这样交换后还是等价于首元素做基准值temp = nums[rand_index];nums[rand_index] = nums[left];nums[left] = temp;//注意到,如果选择首元素做基准值,那么lt最开始就是left+1(对应首元素下标)//因为lt(less than)指针代表小于e的区间的结束下标int lt = left;//gt默认从最右侧+1开始,因为假设最开始大于e的区间是无限大//gt无需担心越界,因为我们遇到nums[i]大于e的情况,交换的是nums[i]与nums[gt-1]int gt = right + 1;//i从left + 1开始,因为首元素是基准值,遍历首元素后面的元素int i = left + 1;//循环结束的条件是i和gt指向同一个元素,此时i左侧最近的区间是等于e的区间,右侧是大于e的区间,完成了一轮三路快速排序while(i < gt){//如果当前元素和基准值相等,i自增1if(nums[i] == pivot){i++;}//如果当前元素小于基准值else if(nums[i] < pivot){//nums[lt+1]和nums[i]互换temp = nums[i];nums[i] = nums[lt+1];nums[lt+1] = temp;//lt和i都自增1lt++;i++;}//如果当前元素大于基准值else{//nums[gt-1]和nums[i]互换temp = nums[i];nums[i] = nums[gt-1];nums[gt-1] = temp;//i无需自增1,留着判断换过来的数//gt自减1,因为多了一个大于e的数,要向左扩大大于e的数组区间gt--;}}//交换nums[lt]与nums[left]temp = nums[lt];nums[lt] = nums[left];nums[left] = temp;//递归小于e和大于e的区间divide3(nums, left, lt-1);divide3(nums, gt, right);
}
int* sortArray(int* nums, int numsSize, int* returnSize) {divide3(nums, 0, numsSize - 1);*returnSize = numsSize;return nums;
}

提交结果:

http://www.yidumall.com/news/33856.html

相关文章:

  • 网站是做百度快照推广好最新网站发布
  • 网站的链接优化长治seo
  • 58同城租房做网站怎么弄白酒最有效的推广方式
  • 稿定设计在线制作友情链接seo
  • 网站推广方法有哪些网络营销和网上销售的区别
  • 官网做有下拉列表的网站的图片营销咨询服务
  • 外星人做的网站石家庄seo网络推广
  • 政府网站平台安全建设方案免费seo网站推荐一下
  • 榆林网站制作爱站网络挖掘词
  • 360免费wifi助手搜索引擎优化包括
  • 杭州有哪些做网站的公司网络营销理论基础有哪些
  • 大理网站建设推广公司运营模式
  • b2b群发网站网站优化是什么意思
  • 网站导航提交入口大全高端网站建设公司排行
  • 建立一个企业网站google中文搜索引擎
  • php带数据库的网站站长统计app下载免费
  • 如何给网站的关键词做排名seo的形式有哪些
  • 做电影解析网站品牌传播方案
  • 网站建设类公司可以拿哪些项目资金如何做网站seo排名优化
  • 3维网站制作技术windows11优化大师
  • 做网站要什么技术成都网站关键词推广优化
  • 我的网站设计联盟小程序制作费用一览表
  • 石河子网站建设公司重庆seo排
  • 如何查询网站备案时间免费长尾词挖掘工具
  • 泉港做网站公司百度官网app
  • 建设网站的3个必要条件百度手机网页
  • 购物返利网站怎么做域名注册管理中心网站
  • 私密浏览器在线观看seo去哪学
  • 影响网站排名的因素国外免费网站域名服务器查询软件
  • 怎么上国外购物网站郑州网站优化seo