扫码关注公众号
快速排序算法在序列已经有序的情况下的复杂度为()
正确答案是B快排在完全无序的情况下效果最好,时间复杂度为O(nlogn),在有序情况下效果最差,时间复杂度为O(n^2)
使用js实现数组的快速排序
快速排序使用了冒泡+分治的思路。每轮从数组中取出一个数作为基准;在排序过程中,小于或等于基准数的全部放到基准的左边,大于基准的全部放右边;再
判断下列说法是否正确:就排序算法平均所用的辅助空间而言,堆排序、快速排序、归并排序的大小关系是堆排序<快速排序<归并排序。()
正确答案是A堆的空间复杂度为1,快速排序为log2(n),归并为n
快速排序的基本思路是什么?
【解析】第一步:选取一个数作为基准(理论上可以随便选取);第二步:分区,比基准值小的放左边,大的放右边,基准值放在两个分区之间;第三步:进行左边分区递归,以及右边分区递归constquicksort=arr=>{constpivotIndex=Math.floor(arr.length/2);//选取基准位置,尽量考虑随机性constpivot=arr.splice(pivotIndex,1)[0];constleft=[];constright=[];arr.forEach((item,idx)=>{if(arr[idx]<pivot){left.push(arr[idx]);}else{right.push(arr[idx]);}});returnquickSort(left).concat([pivot],quickSort(right));//连接左数组、基数组和右数组};
使用荷兰国旗思想优化快速排序代码。
【解析】在快速排序中可以使用荷兰国旗问题所采用的思想,即将每次划分的中间区域用来存放当前基数。publicstaticvoidquickSort(int[]arr){if(arr==null||arr.length<2){return;}quickSort(arr,0,arr.length-1);}publicstaticvoidquickSort(int[]arr,intleft,intright){if(left<right){//下面一句话就是为了避免当前的数组已经为完全有序或者反序的状态swap(arr,left+(int)(Math.random()*(right-left+1)),right);int[]p=partition(arr,left,right);//返回等于基数的起始位置和结束位置quickSort(arr,left,p[0]-1);quickSort(arr,p[1]+1,right);}}publicstaticint[]partition(int[]arr,intleft,intright){intless=left-1;intmore=right;while(left<more){if(arr[left]<arr[right]){swap(arr,++less,left++);}elseif(arr[left]>arr[right]){swap(arr,--more,left);}else{//arr[left]==arr[right]left++;}}swap(arr,more,right);returnnewint[]{less+1,more};}publicstaticvoidswap(int[]arr,inti,intj){inttmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}