前几天实现了直接插入排序、冒泡排序和直接选择排序这三个基础排序。今天看了一下冒泡排序的改进算法,快速排序。单独记录一下,后面还有归并和基数排序等
快速排序
1.选择一个支点默认为数组第一个元素及array[start]作为支点,将所有大于支点元素的值放到支点后面,将所有小于支点元素的值放到支点前面,完成一次划分,返回支点的位置index
2.通过一个划分形成两个带排序的序列,[start, index - 1]和[index + 1, end]两个,在执行1直到序列元素只有1个则已经完成排序
具体解释和注意代码注释中有说明
QuickSort.java
package com.gxf.sort; /**
* 这里实现快速排序
* 快速排序是对冒泡排序的一种改进
* 选数组中的一个元素作为支点,通常选第一个元素
* 将大于支点的元素放到支点后面,将小于支点的元素放到支点前面
* 这样一趟下来,支点前面的就是小于支点元素,支点后面的大于支点元素
* 每一趟划分,返回支点的位置,这样形成了两个带排序的数组,在分别对两个数组进行递归调用
* 直到每次划分只有一个元素
* @author Administrator
*
*/
public class QuickSort {
/**
* 这里是对数组的一趟划分,返回支点在数组中的位置,默认第一个元素为支点
* @param Rec
* @param start
* @param end
* @return
*/
public int quickSort(Rec rec[], int start,int end){
int fulcrum = rec[start].key;//fulcrum有道查的支点
int i = start;
int j = end;//分别指向开头和结束
while(i < j){//i==j时结束一次划分
while(i < j && rec[j].key > fulcrum)//找出右边比支点小的元素
j--;
rec[i].key = rec[j].key;//右边元素之间移到支点位置即可
while(i < j && rec[i].key < fulcrum)//找出左边比支点大的元素
i++;
rec[j].key = rec[i].key;//左边的大于支点元素之间交换过去
}
//这里要不要考虑相等元素的问题
rec[i].key = fulcrum;
return i;
} /**
* 对数组进行快速排序
* 递归实现
* @param rec
*/
public void sort(Rec rec[], int start, int end){
int index;
if(start < end){
index = quickSort(rec, start, end);
sort(rec, start, index - );
sort(rec, index + , end);//注意这里要+1要不然会无限递归,造成栈溢出
}
}
/**
* @param rec
*/
public void sort(Rec rec[]){
sort(rec, , rec.length - );
} }
Rec.java
package com.gxf.sort; public class Rec {
public int key; public Rec(int key){
this.key = key;
}
public Rec(){ }
public void showArray(Rec rec[]){
for(int i = 0; i < rec.length ; i++){ System.out.print(rec[i].key + " ");
}
}
public Rec[] getRecArray(int array[]){
Rec result[] = new Rec[array.length];
for(int i = 0; i < array.length; i++){
result[i] = new Rec(array[i]);
}
return result;
}
}
Test.java
package com.gxf.sort; public class Test { public static void main(String[] args) {
Rec rec = new Rec();
QuickSort quickSort = new QuickSort(); int array[] = new int[]{0, 32, 1, 34, 54, 5, 6};
Rec array_rec[] = rec.getRecArray(array);
System.out.println("使用快速排序之前的顺序:");
rec.showArray(array_rec); quickSort.sort(array_rec); System.out.println("使用快速排序之后的顺序:");
rec.showArray(array_rec);
} }
ps:这里主要参考了西电版的数据结构