快速排序算法

个人博客地址:http://www.klshiguang.xyz/

package www.klshiguang.sort;

/**
 * @author Felix Guo
 * 基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
 * 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 * 三个指针: 第一个指针称为pivotkey指针(枢轴),第二个指针和第三个指针分别为left指针和right指针,
 * 分别指向最左边的值和最右边的值。left指针和right指针从两边同时向中间逼近,在逼近的过程中不停的与枢轴比较,
 * 将比枢轴小的元素移到低端,将比枢轴大的元素移到高端,枢轴选定后永远不变,最终在中间,前小后大。


需要两个函数:


① 递归函数  public static void quickSort(int[]n ,int left,int right)
② 分割函数(一趟快速排序函数) public static int partition(int[]n ,int left,int right)


*/
public class QuickSort {
 public int partition(int[] list, int left, int right) {
  int tmp = list[left];    //数组的第一个作为中轴
  while (left < right) {
   while (left < right && list[right] > tmp) {
    right--;
   }
   //将比枢轴小的元素移到低端,此时high位相当于空,等待低位比pivotkey大的数补上 
   list[left] = list[right];   //比中轴小的记录移到低端
   while (left < right && list[left] <= tmp) {
    left++;
   }
   list[right] = list[left];   //比中轴大的记录移到高端
  }
  //当low == high,完成一趟快速排序,此时low位相当于空,等待pivotkey补上 
  list[left] = tmp; 
  
  //中轴记录到尾
  return left;                   //返回中轴的位置
 }
 
 public void quickSort(int[] list, int left, int right) {
  if (left < right) {
   int middle = partition(list, left, right);  //将list数组进行一分为二
   quickSort(list, left, middle - 1);        //对低字表进行递归排序
   quickSort(list, middle + 1, right);       //对高字表进行递归排序
  }
 }
 
 public void quick(int[] str) {
  if (str.length > 0) {    //查看数组是否为空
   quickSort(str, 0, str.length - 1);
  }
 }
 
 public static void main(String[] args) {
  int[] list={1,3,5,7,9,7,14,15}; 
         QuickSort qs=new QuickSort(); 
         qs.quick(list); 
         for(int i=0;i<list.length;i++){ 
             System.out.print(list[i]+" "); 
         } 

 }

}

参考:http://blog.youkuaiyun.com/wangkuifeng0118/article/details/7286332http://blog.youkuaiyun.com/xuxurui007/article/details/7639863

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值