码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序QuickSort

时间:2014-11-05 22:58:49      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   使用   java   for   sp   

前几天实现了直接插入排序、冒泡排序和直接选择排序这三个基础排序。今天看了一下冒泡排序的改进算法,快速排序。单独记录一下,后面还有归并和基数排序等

快速排序

1.选择一个支点默认为数组第一个元素及array[start]作为支点,将所有大于支点元素的值放到支点后面,将所有小于支点元素的值放到支点前面,完成一次划分,返回支点的位置index

2.通过一个划分形成两个带排序的序列,[start, index - 1]和[index + 1, end]两个,在执行1直到序列元素只有1个则已经完成排序

具体解释和注意代码注释中有说明

QuickSort.java

 1 package com.gxf.sort;
 2 
 3 /**
 4  * 这里实现快速排序
 5  * 快速排序是对冒泡排序的一种改进
 6  * 选数组中的一个元素作为支点,通常选第一个元素
 7  * 将大于支点的元素放到支点后面,将小于支点的元素放到支点前面
 8  * 这样一趟下来,支点前面的就是小于支点元素,支点后面的大于支点元素
 9  * 每一趟划分,返回支点的位置,这样形成了两个带排序的数组,在分别对两个数组进行递归调用
10  * 直到每次划分只有一个元素
11  * @author Administrator
12  *
13  */
14 public class QuickSort {
15     /**
16      * 这里是对数组的一趟划分,返回支点在数组中的位置,默认第一个元素为支点
17      * @param Rec
18      * @param start
19      * @param end
20      * @return
21      */
22     public int quickSort(Rec rec[], int start,int end){
23         int fulcrum = rec[start].key;//fulcrum有道查的支点
24         int i = start;
25         int j = end;//分别指向开头和结束
26         while(i < j){//i==j时结束一次划分
27             while(i < j && rec[j].key > fulcrum)//找出右边比支点小的元素
28                 j--;
29             rec[i].key = rec[j].key;//右边元素之间移到支点位置即可
30             while(i < j && rec[i].key < fulcrum)//找出左边比支点大的元素
31                 i++;
32             rec[j].key = rec[i].key;//左边的大于支点元素之间交换过去
33         }
34         //这里要不要考虑相等元素的问题
35         rec[i].key = fulcrum;
36         return i;
37     }
38     
39     /**
40      * 对数组进行快速排序
41      * 递归实现
42      * @param rec
43      */
44     public void sort(Rec rec[], int start, int end){
45         int index;
46         if(start < end){
47             index = quickSort(rec, start, end);
48             sort(rec, start, index - 1);
49             sort(rec, index + 1, end);//注意这里要+1要不然会无限递归,造成栈溢出
50         }
51     }
52     /**
53      * @param rec
54      */
55     public void sort(Rec rec[]){
56         sort(rec, 0, rec.length - 1);
57     }
58     
59 }

Rec.java

 1 package com.gxf.sort;
 2 
 3 public class Rec {
 4     public int key;
 5     
 6     public Rec(int key){
 7         this.key = key;
 8     }
 9     public Rec(){
10         
11     }
12     public void showArray(Rec rec[]){
13         for(int i = 0; i < rec.length ; i++){
14             
15             System.out.print(rec[i].key + " ");
16         }
17     }
18     public Rec[] getRecArray(int array[]){
19         Rec result[] = new Rec[array.length];
20         for(int i = 0; i < array.length; i++){
21             result[i] =  new Rec(array[i]);
22         }
23         return result;
24     }
25 }

Test.java

 1 package com.gxf.sort;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         Rec rec = new Rec();
 7         QuickSort quickSort = new QuickSort();
 8         
 9         int array[] = new int[]{0, 32, 1, 34, 54, 5, 6};
10         Rec array_rec[] = rec.getRecArray(array);
11         System.out.println("使用快速排序之前的顺序:");
12         rec.showArray(array_rec);
13         
14         quickSort.sort(array_rec);
15         
16         System.out.println("使用快速排序之后的顺序:");
17         rec.showArray(array_rec);
18     }
19 
20 }

bubuko.com,布布扣

ps:这里主要参考了西电版的数据结构

快速排序QuickSort

标签:style   blog   http   color   ar   使用   java   for   sp   

原文地址:http://www.cnblogs.com/luckygxf/p/4077353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!