彩票走势图

Java编程示例:如何实现快速排序

原创|其它|编辑:郝浩|2009-10-20 11:36:48.000|阅读 638 次

概述:快速排序是冒泡排序的改进版本,它的思想是通过一趟排序讲待排序的记录分隔成独立的两部分,其中一不分记录的关键字均小于另一部分关键字,则可以分别对这两部门记录继续进行排序 ,以打倒整个虚列的有序。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

  基本思想:

  快速排序是冒泡排序的改进版本,它的思想是通过一趟排序讲待排序的记录分隔成独立的两部分,其中一不分记录的关键字均小于另一部分关键字,则可以分别对这两部门记录继续进行排序 ,以打倒整个虚列的有序。

  假设待排序的虚列为{L.r[s],L.r[s+1],.......,L.r[t]]} ,首先选取一个记录(通常可一选择第一个记录L.r[s])作为枢轴(或支点),然后按照下述原则重新排列其他记录,讲所有关键字较它小的记录都安置在它的位置之前,将所有关键字较它大的记录都安置在它的位置之后。由此可以该 “枢轴” 记录最后所落的位置i作为分界,将序列{L.r[s],L.r[s+1],.......,L.r[t]]} 分隔成了两个子序列{L.r[s],L.r[s+1],.......,L.r[i-1]]} 和 {L.r[i+1],L.r[s+1],.......,L.r[t]]} ,这个过程叫作一趟快速排序(或者一次划分).

  一趟快速怕序的具体做法是:附设两个指针low和high,他们的初值分别为low和high,设枢轴记录的关键字为privotkey,则首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,然后从low所指向的位置起向后搜索,找到第一个关键字大于privotkey的记录和枢轴记录互相交换,重复这两步直至low==high位置.

  代码一:

 /**
  * 采用交换方式 排序
  */
  package 排序.交换排序;
  import java.util.concurrent.Executor;
  import java.util.concurrent.ExecutorService;
  import java.util.concurrent.Executors;
  /**
  * @author liuyi
  */
  public class 快速排序 {
  public static void main(String[] args) throws InterruptedException {
  int test[] = {15,23,56,7,13,52,20,7};
  new 快速排序().qSort(test, 0, test.length-1);
  for(int k:test) System.out.println(k);
  }
  public void qSort(int []array,int low,int high){
  if(low 
  int privot=partition(array,low,high);
  qSort(array,low,privot-1);
  qSort(array,privot+1,high);
  }
  }
  public int partition(int [] array,int low,int high){
  /**
  * 选择 low位置 作为曲轴(支点)
  */
  int pivot=array[low];
  int temp=0;
  /**
  * 如果 low 
  */
  while(low 
  /**
  * 先从 high端 开始判断
  */
  while(low=pivot) high--;
  /**
  * 进行 置换操作
  */
  if(low 
  temp=array[low];
  array[low]=array[high];
  array[high]=temp;
  low++;
  }
  /**
  * 从 low 端判断
  */
  while(low 
  /**
  * 进行 置换操作
  */
  if(low 
  temp=array[high];
  array[high]=array[low];
  array[low]=temp;
  high--;
  }
  }
  return low;
  }
  }

  具体实现上述算法时候,每交换一对记录需要进行三次记录的移动(赋值)的操作,而实际上,在排序过程中对枢轴记录的赋值是多余的,因为只有在一趟排序结束时,即low==high的位置菜市枢轴记录的最后位置,由此可改写上述算法,先将记录暂时存在r[0]的位置上,排序过程中做r[low]或r[high]的单向移动,直至一趟排序后再将枢轴记录移至正确位置上.

  改写代码

  代码二:

     /**
  * 改进的 快速排序
  */
  package 排序.交换排序;
  import java.util.concurrent.Executor;
  import java.util.concurrent.ExecutorService;
  import java.util.concurrent.Executors;
  /**
  * @author liuyi
  */
  public class 快速排序_1 {
  public static void main(String[] args) throws InterruptedException {
  int test[] = {15,23,56,7,13,52,20,7};
  new 快速排序_1().qSort(test, 0, test.length-1);
  for(int k:test) System.out.println(k);
  }
  public void qSort(int []array,int low,int high){
  if(low 
  int privot=partition(array,low,high);
  qSort(array,low,privot-1);
  qSort(array,privot+1,high);
  }
  }
  public int partition(int [] array,int low,int high){
  /**
  * 选择 low位置 作为曲轴(支点)
  */
  int pivot=array[low];
  int temp=0;
  /**
  * 如果 low 
  */
  while(low 
  /**
  * 先从 high端 开始判断
  */
  while(low=pivot) high--;
  /**
  * 进行 置换操作
  */
  if(low 
  array[low]=array[high];
  low++;
  }
  /**
  * 从 low 端判断
  */
  while(low 
  /**
  * 进行 置换操作
  */
  if(low 
  array[high]=array[low];
  high--;
  }
  }
  array[low]=pivot;
  return low;
  }
  }


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:IT专家网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP