快速排序就是把某一个值排到中间,比如:第一个值跟最后一个开始比,如果比第一个值小,就交换位置,然后再从第一个位置开始找比他大的值,进行交换。
java代码:参考了百科里面的例子
package zy.boring.order.impl;
import zy.boring.order.QuickOrder;
public class QuickOrderImpl implements QuickOrder {
@Override
public int[] quickOrder(int[]data, int low, int high) {
//定义局部变量i,j,初始i,j是递归的首位两个元素的索引
int i = low;
int j = high;
//一开始老不能结束递归,加了这句
if(low<high){
//确定数组第一个元素为目标元素
int keyInt = data[i];
//确保i始终小于j
while(i<j){
//首先通过第一个元素(keyInt)跟从末尾开始的元素逐一比较,找到比keyInt小的元素
while(i<j && keyInt<data[j]){
j--;
}
//把data[i]交换
if(i<j){
data[i] = data[j];
//焦点向右移
i++;
}
//通过keyInt从头开始的元素逐一比较,找到比keyInt大的元素
//这里开始的时候没有加i<j这句,导致了错误,要时刻保持i<j
while(i<j && keyInt>data[i]){
i++;
}
//data[j]交换
if(i<j){
data[j] = data[i];
//焦点向左移
j--;
}
}
data[i] = keyInt;
//调用递归,分别把左半边跟又半边进行排序
quickOrder(data,low,i);
quickOrder(data,i+1,high);
}
return data;
}
}
虽然参考了例子,但还是遇到一些问题,也看到自己的一些不足。
不常编码,junit的使用,递归函数
写了相应的测试,不知道合不合理。
开始的时候判断两个数组是否相等还自己写了一大堆,后来发现原来有工具类可以来用,这里用到了Arrays的工具类。
package zy.boring.order.impl.test;
import java.util.Arrays;
import junit.framework.TestCase;
import zy.boring.order.QuickOrder;
import zy.boring.order.impl.QuickOrderImpl;
public class QuickOrderImplTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
public void testQuickOrder() {
int[] testInt = {5,9,3,8,2,1,6,7};
int[] expectInt = {1,2,3,5,6,7,8,9};
QuickOrder quickOrder = new QuickOrderImpl();
int[] actureInt = quickOrder.quickOrder(testInt, 0, testInt.length-1);
//用数组工具Arrays来比较是否
assertTrue(Arrays.equals(actureInt, expectInt));
}
}