快速排序算法是基于冒泡排序的,是对冒泡排序算法的一个改进。快速排序的效率比较高,是因为它的交换是跳跃式的。每次设置一个基准值,在比较的时候,将小于基准值的元素移到左边,将大于基准值的元素移到右边,这边一般不会只交换相邻的两个数。因此比较和交换的次数都会减少了,排序的效率自然也就高了。
快速排序的思想:
①在数组中找一个基准值,一般是取第一个数(纯粹为了方便);
②建立一个索引right,从数组的尾端开始遍历,直到找到一个比基准值小的数,记录此位置(j);
③建立一个索引left,从数组的首端开始遍历,直到找到一个比基准值大的数,记录此位置(i);
④当 i < j,则交换i和j两个位置上的值,并且继续在j-1位置开始往前遍历,在i+1位置开始往后遍历;
⑤当i == j,证明本次的比较已经结束,此时将i位置的值与基准值交换,基准值已经放在了最终的位置(此时基准值左边的元素都比基准值要小,基准值右边的元素都比基准值要大);
⑥在①~⑤的步骤中,基准值已经放在了正确的位置,我们可以对基准值左边的分区以及基准值右边的分区分别重复进行①~⑤的步骤,直到所有元素有序。
通过以上的步骤可以看出,快速排序算法其实是基于分治算法来实现的。不难写出实现代码:
public classMain {public static voidmain(String[] args) {
Scanner sc= newScanner(System.in);
System.out.println("请输入数组大小:");int size =sc.nextInt();int[] arr = new int[size];
System.out.println("请输入数组:");for(int i = 0; i < size; i++) {
arr[i]=sc.nextInt();
}
quickSort(arr);for(inta : arr) {
System.out.print(a+ " ");
}
}public static void quickSort(int[] arr) {if(arr == null || arr.length <= 1)return;
sort(arr,0, arr.length-1);
}public static void sort(int[] arr, int left, intright) {if(left >right)return;int baseVal =arr[left];int i = left, j =right;while(i !=j) {while(arr[j] >= baseVal && j >i) {
j--;
}while(arr[i] <= baseVal && j >i) {
i++;
}if(i
arr[i]=arr[j];
arr[j]=temp;
}
}
arr[left]=arr[i];
arr[i]=baseVal;
sort(arr, left, i-1);
sort(arr, i+1, right);
}
}