Java 实现快速排序法对数组进行排序

 快速排序是对冒泡排序的一种改进,其排序速度相对较快。

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按照这个方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的。最坏情况的时间复杂度为O(N ^ 2),最好为O(nlog2n)。

快速排序的实现过程:假设要排序的数组是A [1] ... A [N],首先任意选取一个数据(通常选取第一个数据)作为关键数据,然后将所有比他小的数放在前面,所有比他大的放在后面,这个过程称为一次快速排序。一趟快速排序的算法是:

  1. 设置两个变量I,J,排序开始的时候I:= 1,J:= N;
  2. 以第一个数群元素作为关键数据,赋值给X,即X:= A [1];
  3. 从J开始向前搜索,即由后开始向前搜索(J:= J-1),找到第一个小于X的值,两者交换;
  4. 从I开始向前搜索,即由前开始向后搜索(I:= I + 1),找到第一个大于X的值,两者交换;
  5. 重复第3,4步,直到I =学家
public class quickSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] intArray = {12,11,45,6,8,43,40,57,3,20};
		System.out.println("排序前的数组:");
		for(int i=0;i<intArray.length;i++) {
			System.out.print(" "+intArray[i]);		//输出数组元素
			if((i+1)%5==0)				//每5个元素一行
				System.out.println();
		}
		System.out.println();
		int[] b = quickSort(intArray,0,intArray.length-1);		//调用quickSort
		System.out.println("使用快速排序法后的数组:");
		for(int i=0;i<b.length;i++) {
			System.out.print(" "+b[i]);
			if ((i+1)%5==0) {			//每5个元素一行
				System.out.println();
			}
		}
	}

	private static int[] quickSort(int[] array, int left, int right) {	//快速排序法
		// TODO Auto-generated method stub
		//如果开始点和结束点没有重叠的时候,也就是指针没有执行到结尾
		if (left<right-1) {
			int mid = getMiddle(array,left,right);				//重新获取中间点
			quickSort(array,left,mid-1);
			quickSort(array,mid+1,right);
		}
		return array;
		
	}

	private static int getMiddle(int[] array, int left, int right) {
		// TODO Auto-generated method stub
		int temp;
		int mid = array[left];						//把中心置于a[0]
		while(left < right) {
			while(left < right && array[right] >= mid)
				right--;
			temp = array[right];					//将比中心点小的数据移到左边
			array[right] = array[left];
			array[left] = temp;
			
			while(left < right && array[left] <= mid)
				left++;
			temp = array[right];					//将比中心点大的数据移到右边
			array[right] = array[left];
			array[left] = temp;
		}
		array[left] = mid;							//中心移到正确位置
		return left;								//返回中心点
	}
	
	

}

猜你喜欢

转载自blog.csdn.net/czb6816/article/details/84715553