排序算法-快速排序-java

 快速排序法:java

 与它的名字同样,快速排序法排序速度相比其余排序而言,速度更快。数组

 排序规则:dom

 1.将数组中的一个数据做为基准数据,比基准数小的数据放到基准数前面,比基准数大的放到基准数后面;ide

 2.建立两个坐标,一个坐标从最左边开始,一个坐标从最右边开始;ui

 3.先从右边开始找一个比基准数小的数据,找到以后,坐标停在这个位置;code

 4.再从左边开始找一个比基准数大的数据,找到以后,坐标也停在这个位置;blog

 5.交换左右坐标中的数据;排序

 6.再重复以上步骤,直到左右两边的坐标相遇;递归

 7.将当前右边坐标中的数据与基准数交换位置;get

 8.此时,已经完成了第一次排序。左边的数据都比基准数小,右边的数据都比基准数大;

 9.分别获取左右两边的数据,并递归执行以上步骤,最终完成整个排序;

下面直接上图,步骤都在图里面:

上代码:

/**
 * 快速排序法:
 * @author chengxp
 *
 */
public class Quick {

	/**
	 * 排序入口
	 * 
	 * @param arrTarget
	 *            已被分割的数组
	 * @param beginIndex
	 *            被分割数据的开始下标位置
	 * @param endIndex
	 *            被分割数据的结束下标位置
	 */
	public static void entry(int[] arrTarget, int beginIndex, int endIndex) {

		//若只有一个数据,不用排序,直接返回
		if (beginIndex - endIndex >= 0) {
			
			return;
		}
		
		//记录一个坐标,从左边的位置开始
		int iIndex = beginIndex;
		//记录第二个坐标,从右边的位置开始
		int jIndex = endIndex;
		
		//将当前已切割数组中第一个数据做为基准数据
		int target = arrTarget[beginIndex];
		
		//当左右两边的数据未相遇前,保持循环
		while (iIndex < jIndex) {

			//从右边往左边找一个小于/等于基准值的数据,记录当前坐标
			while(target < arrTarget[jIndex] && iIndex < jIndex) {
				
				jIndex--;
			}
			
			//从左边往右边找一个大于基准值的数据,记录当前坐标
			while(target >= arrTarget[iIndex] && iIndex < jIndex) {
				
				iIndex++;
			}
			
			//左边和右边的坐标相遇,表示当前数组已完成了排序
			if(iIndex >= jIndex) {
				
				break;
			}
			//将左右两边各自坐标中的数据进行交换
			DataProvider.changeEntry(arrTarget, jIndex, iIndex);
			System.out.println("changing:" + Arrays.toString(arrTarget));
		}
		
		//每次循环完成后,将基准数的数据和右边坐标中的数据进行交换
		DataProvider.changeEntry(arrTarget, beginIndex, jIndex);

		//继续递归基准数左边的数据
		entry(arrTarget, beginIndex, jIndex - 1);
		//继续递归基准数右边的数据
		entry(arrTarget, jIndex + 1, endIndex);
	}

	public static void main(String[] args) {
		int[] arrTarget = DataProvider.getRandomArray(9);
		System.out.println("before:" + Arrays.toString(arrTarget));
		Quick.entry(arrTarget, 0, arrTarget.length - 1);
		System.out.println("after:" + Arrays.toString(arrTarget));
	}
}

输出结果:

before:[56, 99, 51, 43, 87, 55, 37, 6, 29] changing:[56, 29, 51, 43, 87, 55, 37, 6, 99] changing:[56, 29, 51, 43, 6, 55, 37, 87, 99] changing:[37, 29, 6, 43, 51, 55, 56, 87, 99] after:[6, 29, 37, 43, 51, 55, 56, 87, 99]