扫码关注公众号
判断下列说法是否正确:就排序算法平均所用的辅助空间而言,堆排序、快速排序、归并排序的大小关系是堆排序<快速排序<归并排序。()
正确答案是A堆的空间复杂度为1,快速排序为log2(n),归并为n
下列排序算法中,哪个是稳定的排序算法?
正确答案是C选择排序在调整树的过程中改变节点的顺序导致不稳定,快排一个指针从前之后,一个从后至前,从后往前可能将多个小于基准数据的数原本先进入数组却放在了前面,归并算法采用的归并方式稳定的话就可以保证其稳定性,希尔排序是因为增量对不同组的顺序形成一种隔离,每个组内稳定,多个组在一起就不稳定。
快速排序的基本思路是什么?
【解析】第一步:选取一个数作为基准(理论上可以随便选取);第二步:分区,比基准值小的放左边,大的放右边,基准值放在两个分区之间;第三步:进行左边分区递归,以及右边分区递归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));//连接左数组、基数组和右数组};
数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。例如1,2,3,2,2,2,5,4,2,数字2在数组中出现了5次,超过数组长度的
【解析】受快速排序的启发,在快速排序中,现在数组中选择一个数字,然后调整数组中的数字的顺序,使得比选中数字小的数字都排在它的左边,比选中数字大的数字都排在它的右边。如果选中的数字的下标刚好是n/2,那么这个数字就是数组中的中位数。importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);intn=in.nextInt();int[]num=newint[n];for(inti=0;i<n;i++){num[i]=in.nextInt();}intb=GetHalfNum(n,num);if(b!=-1){System.out.println(b);}}publicstaticintGetHalfNum(intuiInputNum,int[]pInputArray){if(pInputArray==null||uiInputNum<=0){return-1;}intmiddle=uiInputNum>>1;//长度的一半intstart=0;intend=uiInputNum-1;intindex=partition(pInputArray,start,end);while(index!=middle){//如果不等于长度的一半说明就没有找到这个中位数if(index>middle){end=index-1;index=partition(pInputArray,start,end);}else{start=index+1;index=partition(pInputArray,start,end);}}returnpInputArray[index];//index=middle}publicstaticintpartition(int[]a,intstart,intend){intprivot=a[start];inti=start;intj=end;while(i<j){while(i<j&&privot<=a[j]){j--;}swap(a,i,j);while(i<j&&privot>=a[i]){i++;}swap(a,i,j);}returni;}publicstaticvoidswap(int[]a,inti,intj){intt=a[i];a[i]=a[j];a[j]=t;}}