扫码关注公众号

排序算法之高级排序
01-21
488观看
01

以下哪种不是非稳定排序算法

正确答案是A(1)冒泡排序冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果

来自:排序算法-简单排序(冒泡、简单选择等)
02

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

对每个string做循环,记录里面每种字母的数量,然后加入到map中,最后map中相同键值的就是异位词。classSolution{public:vector<vector<string>>groupAnagrams(vector<string>&strs){intn=strs.size();if(!n)return{};unordered_map<string,vector<string>>m;for(inti=0;i<n;i++){stringcount="00000000000000000000000000";for(intk=0;k<strs[i].size();k++)count[strs[i][k]-'a']+=1;//elsem[count].push_back(strs[i]);}vector<vector<string>>ret;vector<string>temp;for(autoit=m.begin();it!=m.end();it++)ret.push_back(it->second);returnret;}};

来自:排序算法-高级排序(快排、堆排等)
03

有一个公司有若干员工,要求设计一个签到系统来记录员工的签到顺序,并能够在nlogn的时间复杂度内利用尽可能少的辅助空间将签到的员工按照员工i

思路:在所有算法中只有堆排序和归并排序能够达到时间复杂度的要求,而堆排序对空间的要求又要优于归并排序,所以最后采用了堆排序来实现。/*构建员工模型*/classStaff{intid;//员工idStaff(intid){this.id=id;}publicvoidsetId(intid){this.id=id;}publicintgetId(){returnthis.id;}}publicclassStaffSort{privateStaff[]log;//记录员工序号序列privateinttotalStaff;//员工总人数privateintcurrentStaff;//此时员工人数publicStaffSort(inttotalStaff){//TODOAuto-generatedconstructorstubthis.totalStaff=totalStaff;currentStaff=0;log=newStaff[totalStaff];}/**@authorSam*@paramid*@returnisSuccess*Described员工签到*/publicbooleancheck(intid){StaffnewStaff=newStaff(id);log[currentStaff]=newStaff;trickleUp(currentStaff++);returntrue;}/**@authorSam*@paramindex*@returnisSuccess*Described向上调整堆模型,使各点的值不大于其双亲结点的值*/publicvoidtrickleUp(intindex){intparent=(index-1)/2;Staffbottom=log[index];while(index>0&&log[parent].getId()<bottom.getId()){log[index]=log[parent];index=parent;parent=(parent-1)/2;}log[index]=bottom;}/**@authorSam*@param*@returnroot*Described获取并删除堆顶*/publicStaffremove(){Staffroot=log[0];log[0]=log[--currentStaff];trickleDown(0);returnroot;}/**@authorSam*@paramindex*@return*Described向下调整堆结构,是堆顶元素不小于孩子结点的值*/publicvoidtrickleDown(intindex){intlargeChild;Stafftop=log[index];while(index<currentStaff/2){intleftChild=2*index+1;intrightChild=leftChild+1;if(rightChild<currentStaff&&log[leftChild].getId()<log[rightChild].getId()){largeChild=rightChild;}else{largeChild=leftChild;}if(top.getId()>=log[largeChild].getId()){break;}log[index]=log[largeChild];index=largeChild;}log[index]=top;}/**@authorSam*@paramargs*@return*Described打印排序后的结果*/publicstaticvoidmain(String[]args){int[]staffs=newint[]{1,3,5,2,12,10,15};StaffSortss=newStaffSort(50);for(inti=0;i<staffs.length;i++){ss.check(staffs[i]);}while(ss.currentStaff!=0){System.out.print(ss.remove().getId()+"");}}}

来自:排序算法-高级排序(快排、堆排等)
课程
专栏
堆的实现(图片演示+文字讲解)
csdn
堆排序与快速排序比较
csdn
快速排序
堆排序
四大高级排序
csdn
高级排序
算法-排序算法-高级排序(快排、堆排等)
3专栏
1课程
3 试题