数据结构与算法快速排序
一、定义
同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。
不同的是,冒泡排序在每一轮中只把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种情况茶为国饮,是我们日常生活里润喉解渴的必需品,茶水香气清鲜悠扬,口感甘醇甜润,由此可见喝茶是一种非常舒适且滋润的美事。如今人们喝茶也越发讲究了,尤其是泡茶的过程,不知大家对于各类茶的
社保缴费情况去哪查?一分钟看懂!视频加载中不麻烦,很方便!线上线下都可以!您可以通过国家社会保险公共服务平台(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。眩晕(肾精不足)眩是指眼花或眼前发黑,晕是指头晕甚或感觉自身或外界景物旋转。二者常同时并见,故统称为眩晕。中医内科学将眩晕分为肝阳上亢证气血亏虚证肾精不足证痰湿中阻证和瘀血阻窍