快速排序是对冒泡排序的一种改进,其排序速度相对较快。
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按照这个方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的。最坏情况的时间复杂度为O(N ^ 2),最好为O(nlog2n)。
快速排序的实现过程:假设要排序的数组是A [1] ... A [N],首先任意选取一个数据(通常选取第一个数据)作为关键数据,然后将所有比他小的数放在前面,所有比他大的放在后面,这个过程称为一次快速排序。一趟快速排序的算法是:
- 设置两个变量I,J,排序开始的时候I:= 1,J:= N;
- 以第一个数群元素作为关键数据,赋值给X,即X:= A [1];
- 从J开始向前搜索,即由后开始向前搜索(J:= J-1),找到第一个小于X的值,两者交换;
- 从I开始向前搜索,即由前开始向后搜索(I:= I + 1),找到第一个大于X的值,两者交换;
- 重复第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; //返回中心点
}
}