zoukankan      html  css  js  c++  java
  • 快速排序中寻找枢轴的三种方法


    这三种方法,非常的巧妙,总结一下,可以很巧妙的用到以后的算法中去,这种考虑问题的方式,将给我们带来很多的启发。
    1 void qsort(char *v[], int left, int right) 2 { 3 int i,last; 4 void swap(char *v[], int i, int j); 5 if (left >= right) 6 return 7 swap(v,left,(left + right)/2); 8 last = left; 9 for( i = left+1; i<= right; i++){ 10 if (strcmp(v[i],v[left]) < 0){ 11 swap(v,++last,i); //lasti : pointer as first num bigger than tgt 12 } 13 swap(v,left,last); 14 qsort(v,left,last-1); 15 qsort(v,last+1,right); 16 } 17 } 18
    思路一:
    使用连个指针,lasti和i之间的部分为比pivot大的内容作为可以替换的地带,最后的lasti指针就是 pivot的分界点,交换一下 left和last就能完成一次partition。 19 void qsort_1(char* v[], int left,int right) 20 { 21 int pivot; 22 tgt = v[left] 23 while (left < right ){ 24 while((v[right--] > tgt) && (left < right)) 25 right --; 26 v[left] = v[right] 27 while ((v[left++] <= tgt) && (left < right)) 28 left ++; 29 v[right] = v[left] 30 } 31 pivot = left; 32 v[pivot] = tgt; 33 34 qsort(v,left,pivot-1); 35 qsort(v,pivot+1,right); 36 }
    思路二:
      采用的赋值的方式,从右到左,寻找到一个不符合条件的元素,之后直接赋值到左侧可替换位置,真个过程中,从右向左的过程中,左边的可替换位置的数值已经备份,viceversa。因此这个过程结束的时候当right==left的时候。left位置上的数值一定是冗余的,因此赋值为v[pivot]
     38 void qsort_2(char* v[], int left,int right)
     39 {
     40     int pivot;
     41     tgt = v[left]
     42     while (left < right ){
     43         while((v[right--] > tgt) && (left < right))
     44             right --;
     45         swap(v,righ,left)
     46         while ((v[left++] <= tgt) && (left < right))
     47             left ++;
     48         swap(v,right,left)
     49     }   
     50     pivot = left;
     51     qsort(v,left,pivot-1);
     52     qsort(v,pivot+1,right);
     53 }

    思路三:这是思路二的一个小变种,不再使用赋值的方式,而是使用交换,这个过程有点意思的是很像把partition的标准初始时候的v[left]当作一个token传递来回,每次两个数字交换,另外一个数字一定是这个token,所以最后right==left的时候,token自然就在partition的位置上。

  • 相关阅读:
    2018.7.19 AK22 续集
    2018.7.18 上半年课程总结 4- 高级英语
    智商税 与 易感人群
    2018.7.14 上半年课程总结-经济学2
    2018.7.13 上半年课程总结-经济学1
    PyQt(Python+Qt)学习随笔:QListWidget的addItems增加多项的方法
    PyQt(Python+Qt)学习随笔:QListWidget的addItem方法
    PyQt(Python+Qt)学习随笔:QListWidgetItem的重要方法
    PyQt(Python+Qt)学习随笔:复选框状态枚举类Qt.CheckState取值及含义
    一路向北,目标:武汉!
  • 原文地址:https://www.cnblogs.com/harveyaot/p/3344902.html
Copyright © 2011-2022 走看看