以前也零零碎碎发过一些排序算法,但排版都不太好,这次重新整理一次,排序算法是数据结构的重要部分,面试必问,系统地学习很有必要!
算法思想:
functionselectionSort(arr){varlen=arr.length;varminIndex,temp;for(vari=0;ivoidQuickSort(vector&v,intlow,inthigh){if(low>=high)//结束标志return;intfirst=low;//低位下标intlast=high;//高位下标intkey=v[first];//设第一个为基准while(first=key)last--;if(first归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
算法思想:1.把长度为n的输入序列分成两个长度为n/2的子序列;2.对这两个子序列分别采用归并排序;3.将两个排序好的子序列合并成一个最终的排序序列。
voidprint(inta[],intn){for(intj=0;j计数排序统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。
#include#include#includeusingnamespacestd;//计数排序voidCountSort(vector&vecRaw,vector&vecObj){//确保待排序容器非空if(vecRaw.size()==0)return;//使用vecRaw的最大值+1作为计数容器countVec的大小intvecCountLength=(*max_element(begin(vecRaw),end(vecRaw)))+1;vectorvecCount(vecCountLength,0);//统计每个键值出现的次数for(inti=0;i0;i--)//此处逆序是为了保持相同键值的稳定性vecObj[--vecCount[vecRaw[i-1]]]=vecRaw[i-1];}intmain(){vectorvecRaw={0,5,7,9,6,3,4,5,2,8,6,9,2,1};vectorvecObj(vecRaw.size(),0);CountSort(vecRaw,vecObj);for(inti=0;i一种多关键字的排序算法,可用桶排序实现。
intmaxbit(intdata[],intn)//辅助函数,求数据的最大位数{intmaxData=data[0];///<最大数///先求出最大数,再求其位数,这样有原先依次每个数判断其位数,稍微优化点。for(inti=1;i=p){//p*=10;//MaybeoverflowmaxData/=10;++d;}returnd;/*intd=1;//保存最大的位数intp=10;for(inti=0;i=p){p*=10;++d;}}returnd;*/}voidradixsort(intdata[],intn)//基数排序{intd=maxbit(data,n);int*tmp=newint[n];int*count=newint[10];//计数器inti,j,k;intradix=1;for(i=1;i<=d;i++)//进行d次排序{for(j=0;j<10;j++)count[j]=0;//每次分配前清空计数器for(j=0;j=0;j--)//将所有桶中记录依次收集到tmp中{k=(data[j]/radix)%10;tmp[count[k]-1]=data[j];count[k]--;}for(j=0;j