范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

数据结构与算法快速排序

  一、定义
  同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。
  不同的是,冒泡排序在每一轮中只把1个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成两个部分。
  这种思路就叫作分治法。
  二、思路
  1、基准元素的选择
  基准元素,英文是pivot,在分治过程中,以基准元素为中心,把其他元素移动到它的左右两边 我们可以随机选择一个元素作为基准元素,并且让基准元素和数列首元素交换位置。
  2、元素的比较
  选定了基准元素以后,我们要做的就是把其他元素中小于基准元素的都交换到基准元素一边,大于基准元素的都交换到基准元素另一边。
  (1)双边循环法
  首先,选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素
  接下来进行第1次循环:
  从right指针开始,让指针所指向的元素和基准元素做比较。
  如果大于或等于pivot,则指针向左移动;
  如果小于pivot,则right指针停止移动,切换到left指针;
  轮到left指针行动,让指针所指向的元素和基准元素做比较。
  如果小于或等于pivot,则指针向右移动;
  如果大于pivot,则left指针停止移动 左右指针指向的元素交换位置。
  由于left开始指向的是基准元素,判断肯定相等,所以left右移1位。
  由于7>4,left指针在元素7的位置停下。这时,让left和right指针所指向的元素进行交换。
  接下来,进入第2次循环,重新切换到right指针,向左移动。right指针先移动到8,8>4,继续左移。由于2<4,停止在2的位置。
  (2)单边循环法
  单边循环法只从数组的一边对元素进行遍历和交换。
  开始和双边循环法相似,首先选定基准元素pivot。
  同时,设置一个mark指针指向数列起始位置, 这个mark指针代表小于基准元素的区域边界。
  接下来,从基准元素的下一个位置开始遍历数组。
  如果遍历到的元素大于基准元素,就继续往后遍历 如果遍历到的元素小于基准元素,
  则需要做两件事:
  第一,把mark指针右移1位,因为小于pivot的区域边界增大了1;
  第二,让最新遍历到的元素和mark指针所在位置的元素交换位置,
  因为最新遍历的元素归属于小 于pivot的区域 首先遍历到元素7,7>4,所以继续遍历。
  接下来遍历到的元素是3,3<4,所以mark指针右移1位
  随后,让元素3和mark指针所在位置的元素交换,因为元素3归属于小于pivot的区域。
  按照这个思路,继续遍历,后续步骤如图所示
  三、代码实现
  1、双边循环法import java.util.Arrays;  /**  * 快速排序:双边循环法  */ public class QuickSort {     public static void quickSort(int[] arr, int startIndex,                                  int endIndex) {         // 递归结束条件:startIndex大于或等于endIndex时         if (startIndex >= endIndex) {             return;         }         // 得到基准元素位置         int pivotIndex = partition(arr, startIndex, endIndex);         // 根据基准元素,分成两部分进行递归排序         quickSort(arr, startIndex, pivotIndex - 1);         quickSort(arr, pivotIndex + 1, endIndex);     }      /**      * 分治(双边循环法)      *      * @param arr        待交换的数组      * @param startIndex 起始下标      * @param endIndex   结束下标      * @return      */     private static int partition(int[] arr, int startIndex, int endIndex) {         // 取第1个位置(也可以选择随机位置)的元素作为基准元素         int pivot = arr[startIndex];         int left = startIndex;         int right = endIndex;         while (left != right) {         //控制right 指针比较并左移             while (left < right && arr[right] > pivot) {                 right--;             }         //控制left指针比较并右移             while (left < right && arr[left] <= pivot) {                 left++;             }         //交换left和right 指针所指向的元素             if (left < right) {                 int p = arr[left];                 arr[left] = arr[right];                 arr[right] = p;             }         }         //pivot 和指针重合点交换         arr[startIndex] = arr[left];         arr[left] = pivot;         return left;     }      public static void main(String[] args) {         int[] arr = new int[]{4, 7, 3, 5, 6, 2, 8, 1};         quickSort(arr, 0, arr.length - 1);         System.out.println(Arrays.toString(arr));     } }
  2、单边循环法import java.util.Arrays;  /**  * 快速排序:单边循环法  */ public class QuickSort {     public static void quickSort(int[] arr, int startIndex,                                  int endIndex) {         // 递归结束条件:startIndex大于或等于endIndex时         if (startIndex >= endIndex) {             return;         }         // 得到基准元素位置         int pivotIndex = partition(arr, startIndex, endIndex);         // 根据基准元素,分成两部分进行递归排序         quickSort(arr, startIndex, pivotIndex - 1);         quickSort(arr, pivotIndex + 1, endIndex);     }      /**      * 分治(单边循环法)      *      * @param arr        待交换的数组      * @param startIndex 起始下标      * @param endIndex   结束下标      * @return      */     private static int partition(int[] arr, int startIndex, int endIndex) {         // 取第1个位置(也可以选择随机位置)的元素作为基准元素         int pivot = arr[startIndex];         int mark = startIndex;         for (int i = startIndex + 1; i <= endIndex; i++) {             if (arr[i] < pivot) {                 mark++;                 int p = arr[mark];                 arr[mark] = arr[i];                 arr[i] = p;             }         }         arr[startIndex] = arr[mark];         arr[mark] = pivot;         return mark;     }      public static void main(String[] args) {         int[] arr = new int[]{4, 7, 3, 5, 6, 2, 8, 1};         quickSort(arr, 0, arr.length - 1);         System.out.println(Arrays.toString(arr));     } }
  四、复杂度
  时间复杂度:O(nlogn)
  空间复杂度:O(1)
  稳定性:非稳定性排序

新杀手3地图上的改变,最终的成品令人流连忘返新杀手系列在首作就打造出一个独特而又成熟的框架,其后的DLC或续作也更多在于地图上的改变,杀手3则是在这成熟框架上的包括玩法在内的一次进化,最终的成品令人流连忘返。我将从全新的场景永恒岛60级转职必看攻略,让你少走弯路,一帆风顺的完成转职哈喽大家好,我是鸭鸭呀,距离永恒岛手游公测已经过去很长时间了,相信其中大部分玩家都已经转职了,但是还是有许多玩家在转职过程中比较迷茫,找不到转职书或者是找不到转职地方,接下来我就给LCK转会期将至,T1小吕布说出心里话,Faker有望续约2022电竞季时至11月15日,休赛期即将过半,让万千LOL召唤师心心念念的LPLLCK转会期脚步将至,与往年一致,大量英雄联盟顶尖选手与俱乐部的合同即将到期,去留存疑,包括捧起过VR第一人称射击游戏X8新增PSVR2版本日本开发商Thirdverse今天(11月15日)宣布,虚拟现实FPS游戏X8将增加PSVR2版本。此前官方已经确认游戏将于Steam和OculusStore发布PC和Quest版天龙八部手游天命玄风技能搭配与玩法攻略绝世藏宝图不仅能得到附体内丹和宝珠外,最重要的就是开图的玩家可以卖位置和获得凤凰元神,这期就来聊聊天命玄风的技能搭配与玩法。作为中期平衡型神兽,在天龙手游国际服中对小氪玩家来说,还静默在家,重庆一家三口,做三菜一汤走红,网友能喝口汤吗近几年口罩一直困扰着大家,时常出现静默状态,最近重庆因为口罩的原因,城市处于静默状态,大家都居家隔离。重庆一三口之家,在隔离之前囤了不少食物,静默在家,妻子小芸便操起了做饭的工作,暖心!网友楼下的社区火锅店竟然免费送菜,给老板点赞最近因为疫情的问题很多朋友都下不了楼没有存够菜的朋友们也是很慌张但没想到网友小田田不甩你却收到了意外之喜他们家楼下常吃的火锅店老板居然在免费送菜!微信跟他说房号,半个小时就送到了而破我防是吧?网友列举苹果手机23大罪状太真实了11月15日,微博上出现一则热搜iPhone用户羡慕安卓手机的地方,很多网友都在疯狂吐槽,其中有一位虎扑老哥总结了苹果手机23条缺点,网友看了表示真想打印下来贴那厨子的办公桌上。2全国大概5亿户家庭,存款达到50万的有多少?储户确实没想到最近这两年,受到疫情反复,以及实体经济不景气的影响,老百姓存钱的意愿是越来越强烈。人们之所以要存钱,就是为了应对失业疫情疾病等突发事件。因为手里如果有了一笔钱,就能烫平人生的波动。关晓彤金鸡奖造型直呼辣眼睛,造型师要挨打吗?别的女星穿得多艳就在前几天,国家举办金鸡奖,众多明星参与。1998年出生在北京的关晓彤造型引起我们关注。关晓彤黑配白简单的穿搭,给关晓彤几分成熟,可是除了成熟,缺点也太多了。关晓彤签名关晓彤在金鸡野餐聚会氛围神器自带炫灯的sanag塞那M13SPro便携式无线音箱视频加载中姐妹们最近又入手了sanag塞那M13SPro便携式无线音箱。IPX7级防水体系在户外使用根本无需惧怕雨水。出色的外表轻巧的机身可轻松放入口袋。多种潮流配色随心选。单次充
起底谁在抹黑攻击杜锋,所为何来?期望新一届国篮团结向前在国家男篮参加世预赛第五窗口期比赛前期和比赛期间,对杜锋的言论攻击达到了顶峰,规模性集体性论调就是任人唯亲夹带私货,最具代表性的自媒体就是球迷统筹出来的十大恶人。篮球评论人苏群说有有人喝,有人倒,头道茶到底是精华还是脏水?不一定,分3种情况茶为国饮,是我们日常生活里润喉解渴的必需品,茶水香气清鲜悠扬,口感甘醇甜润,由此可见喝茶是一种非常舒适且滋润的美事。如今人们喝茶也越发讲究了,尤其是泡茶的过程,不知大家对于各类茶的社保缴费情况去哪查?一分钟看懂!视频加载中不麻烦,很方便!线上线下都可以!您可以通过国家社会保险公共服务平台(httpsi。12333。gov。cn)全国人力资源和社会保障政务服务平台(httpwww。12333卡塔尔世界杯卡塔尔世界杯D组法国胜丹麦新华网11月26日,法国队球员吉鲁(右)在比赛中头球攻门。新华社记者陈诚摄11月26日,法国队球员姆巴佩(上)和丹麦队球员拉斯穆斯克里斯滕森在比赛中拼抢。收购22年独行侠价值翻10倍!库班当年我自己打电话卖季票直播吧11月27日讯独行侠老板库班近日接受了GQ杂志的采访,并回忆了自己初到独行侠时的工作状态。2000年,库班以2。85亿美元的价格收购独行侠,2014年球队价值升至7。65亿美CBA往事录之十五番外篇卡塔尔的西亚乔丹亚辛上世纪90年代末及20世纪初,中国男篮在亚洲的主要竞争对手为韩国日本以及菲律宾。彼时的西亚各国还没有对中国男篮构成太大的威胁。在伊朗黎巴嫩约旦崛起之前,能够在与中国队交手时引起重视吴亦凡被判13年,而当初力挺他的三位名女人,如今也不好过吴亦凡的案件终于迎来了大结局谁能想到是一个顶流的明星居然能够犯下如此多的恶行13年的刑期再加上偷逃税被罚6亿再无前途可言可网友们还没忘记当初吴亦凡事发时有三位重量级的名人发声力挺吴赵丽颖新剧风吹半夏开播,一起来聊聊观后感由赵丽颖欧豪李光洁主演的电视剧风吹半夏今日开播。看了两集比我之前预期要好,就凭片头的审美就很有质感,导演的拍摄手法挺抓观众眼球的,那个年代滤镜效果表现不错,有一种看电影屏幕的画面。风吹半夏今晚开播,赵丽颖欧豪黄澄澄从零开始闯荡钢铁江湖号外!号外!号外!各位家人们翘首以盼的时代群像闯剧风吹半夏今天1930爱奇艺全网独播浙江卫视江苏卫视上星播出风吹半夏改编自阿耐的小说不得往生傅东育毛溦执导张挺傅东育编剧赵丽颖欧豪李过了35岁一定要常吃的一种补钙食品正常人骨骼的生长和退化是由两种细胞共同起作用,一种是成骨细胞,一种是破骨细胞,双方势力此消彼长,维持动态平衡。35岁之前,成骨细胞占优势,骨骼呈现一个积累生长的过程,直至骨量达到一肾精不足的四种表现,千万要注意1。眩晕(肾精不足)眩是指眼花或眼前发黑,晕是指头晕甚或感觉自身或外界景物旋转。二者常同时并见,故统称为眩晕。中医内科学将眩晕分为肝阳上亢证气血亏虚证肾精不足证痰湿中阻证和瘀血阻窍