快速排序(快速排序系统学习)

Posted alice-fourier

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序(快速排序系统学习)相关的知识,希望对你有一定的参考价值。

快速排序其实是使用分治法的思想,即在原数组中找一个数p,然后将原数组中比数p大的数放到此数的右边,比数p小的数放到次数的左边。

口诀:1.找中轴  2.左边快排  3.右边快排

主体代码如下:

void quick_sort(int * data,int left,int right){
  if(left < right){
    int* index = partition(data,left,right);
    quick_sort(data,left,index[0]-1);
    quick_sort(data,index[1]+1,right);
  }
}

快速排序中,最重要的是分区partition函数的编写,有三种实现方法:

1.单向扫描分区法

技术图片

代码如下:

int partition(int * data,int left,int right){
  int piovet = left,scanner = left+1,bigger = right;
  while(scanner <= bigger){
    if(data[scanner] <= data[piovet])
      scanner++;
    else{
      swap(data,bigger,scanner); 
      bigger--;
    }
  }
  swap(data,bigger,piovet); 
  return bigger;
}

2.双向扫描分区方法

 双向扫描的思路是,头尾指针往中间扫描,从左找到大于主元的元素,从右找到小于等于主元的元素,二者交换,继续扫描,直到左侧无大元素,右侧无小元素。

技术图片

代码如下:

int partition(int * data,int left,int right){
  int piovet = left,smaller = left+1,bigger = right;
  while(bigger >= smaller){
    while(data[smaller] <= data[piovet]&& smaller <= bigger) smaller++;
    while(data[bigger] > data[piovet] && smaller <= bigger) bigger--;
    if(smaller < bigger){
      swap(data,smaller,bigger); 
    }
  }
  swap(data,bigger,piovet); 
  return bigger;
}

3.三指针分区法--有相同元素时,可以提升效率

技术图片

代码如下:

int* partition(int * data,int left,int right){
  int val[2] = {0};
  int equal = left,scanner = left+1,bigger = right;
  while(bigger >= scanner){
    if(data[scanner] < data[equal]){
      swap(data,scanner,equal);
      scanner++;
      equal++;
    }else if(data[scanner] == data[equal]){
      scanner++;
    }else{
      swap(data,scanner,bigger);
      bigger--;
    }
  }
  val[0] = equal;
  val[1] = bigger;
  return val;
}

以上是关于快速排序(快速排序系统学习)的主要内容,如果未能解决你的问题,请参考以下文章

排序--快速排序学习

轻松学习快速排序(二 )-- 快速排序优化

Java 快速排序算法

快速排序学习

写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。(提示:不能使用系统已有函数,另外请仔细回忆以前学习过的 基础知识)

学习算法 -- 马桶排序冒泡排序和快速排序