快排三路划分

来源:互联网 发布:淘宝美工招聘兼职 编辑:程序博客网 时间:2024/05/22 06:25

RT,代码如下;

//快排三路划分,解决大量重复元素问题int Partition_3(int A[], int low , int high) {//low,high移动指针;left,right保存左右边界int i,j,left,right;left = i = low;j = high;int pivot = A[low];//第一个为枢轴元素while (low < high) {while (low<high && A[high]>=pivot) {if(A[high]==pivot){swap(A[high],A[j]);j--;}high--;} A[low] = A[high];while (low<high && A[low]<=pivot)  {if(A[low]==pivot){swap(A[low],A[i]);i++;}low++;}A[high] = A[low];}//最终low和high相遇,三个指针将数组分成3部分://left->i(左边和pivot相等的元素);//i->low(high)(比pivot小的元素);//low(high)->j(比pivot大的元素);//j->right(右边和pivot相等的元素);//执行交换,将等于pivot的元素全部放到中间(类似数组循环移位)int a,b;for (a=i,b=low;a<(i+low)/2;a++){swap(A[a],A[b]);}for (a=left,b=low;a<(left+low)/2;a++){swap(A[a],A[b]);}//左边换完for (a=low,b=j;a<(low+j)/2;a++){swap(A[a],A[b]);}for (a=low,b=right;a<(low+right)/2;a++){swap(A[a],A[b]);}//右边换完return low;}


0 0
原创粉丝点击