算法(快速排序)

快速排序就是把某一个值排到中间,比如:第一个值跟最后一个开始比,如果比第一个值小,就交换位置,然后再从第一个位置开始找比他大的值,进行交换。
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));
	}

}

你可能感兴趣的:(算法,JUnit,J#)