8个排序的快速排序c详细问题链接思路分析问题代码详细指南
主题链接
这道题目链接可以用来测试我们所书写的算法是否正确
排序数组
分析思路先看看快速排序的定义
快速排序是苹果头发在1960年提出的。 其基本思想是,将排序后的数据用一次排序分割成独立的两个部分,其中一个部分的所有数据小于其他部分的所有数据,然后用该方法分别高速地对两个部分的数据进行排序,从而递归地对整个排序过程进行排序
在快速排序中,首先需要确定基本要素并进行快速排序。 可以将数组中的元素按基本元素分为两部分,前面的部分小于基本元素,后面的部分大于基本元素,然后继续分组,进行比较,最终得到有序的数组
于是我们整理了大致的想法
选择基准元素,作为比较的依据,我们通常默认使用双指针以数组的第一个元素为基准元素从后向前查找小于第一个基准元素的元素,从前向后查找大于第一个基准元素的元素,找到大于基准元素的元素和小于基准元素的元素时,我们会看到两个排序完成后,交换基准元素和指针指向的元素。 此时观察数组按基准要素分为两部分。 按基准因素将序列分为两部分,分别按上述步骤3358 www.Sina.com/http://www.Sina.com /
首先确定基准元素,然后从后面查找小于第一个基准元素的数量
然后从左到右寻找大于第一个基准元素的元素,找到两者后,进行交换
然后继续找
直到两个指针指向同一个位置
通过将这个位置与基准要素进行交换,我们的快速排序结束,然后一句话左右分开区间,重复上述过程
我们知道快速排序不稳定,而且在数组本身接近有序的情况下,存在快速排序性能差的问题,为此,提出了一种处理基准元素的三进制方法
比较数组的头、尾和中间元素,并选择中值作为基准元素,可以改善数组基本有序排序时的性能问题
求解问题的代码class Solution {public://三数为intmidvalue(vectorintnums,int left,int right ) int mid=left (right-left )//if(nums[left]nums[mid] ) if ) nums[mid]nums[right] )返回mid; else { ret=(nums [ left ] nums [ right ] )? right :左; 返回ret; }else{if(nums[right]nums[mid] )返回mid; ELSE{ret=() nums[left]nums[right]? right :左; 返回ret; }}voidquicksort(vectorintnums,int left,int right ) if (left right ) return; //中值的intmid=midvalue(nums,left,right ); WAP(nums[left],nums[mid]; int begin=left; int end=right; int key=left; while(leftright )//从右向左查找,小于key的值while left right nums [ right ]=nums [ key ] ) { --right; (//从左向右查找,大于key的值while (left right nums [ left ]=nums [ key ] ) left; //这里表示找到了两个需要更换的数字swap(nums[left],nums[right] )。 //这里说明交换已经完成。 这里需要交换key值和right值//为什么是right呢? 因为每次right都是先开始搜索的,所以right一定可以保证是小值的swap(nums[key],nums[right] )。 //在此递归进程quicksort(Nums,begin,right-1 ); 快速排序(nums,right 1,end ); } vectorintsortarray (vectorintnums ) quicksort ) nums,0,nums.size(-1 ); 返回编号; }; 高级指南示例图