今天为大家介绍固定基准元的快速排序
首先它是一种排序算法,排序算法是为了让无序的数据组合变成有序的数据组合。有序的数组在进行数据定位和采用时非常方便,因为有序的数据可以减少设计代码的麻烦因为无序数据进行推断前后关系时会显得很繁琐。
若数据较大则采用快速排序,快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
固定基准元:即选取数组块第一个元素作为基元
快速排序分为三个步骤
1.选择基准:选取第一个元素作为基准
2.分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大
3.递归操作:对两个序列块进行快速排序,直到序列为空或者只有一个元素
以下是我的代码和一些注释
- private int[] data;
- QuickSort(int[] data) {
- this.data = data;
- }
- public void startSort(int low, int high) {
- if (low >= high)
- return;
- int partition = Partition(low, high);
- // 以第一个元素为基准元素,大于基准元素的在右边,小于的在左边
- startSort(low, partition - 1); //递归调用左半边数组
- startSort(partition + 1, high); //递归调用右半边数组
- }
- /*
- * 将数组分成两块,返回基准元素在数组中的位置
- *
- * @param arr待排序数组
- *
- * @param low,high 规定数组中的待排序数据块位置
- */
- public int Partition(int low, int high) {
- int begin = low;
- int end = high;
- int key = data[low];// 取该数组的第一个元素作为基准元素
- while (begin < end) {
- while (begin < end && data[end] >= key) {
- end--;
- }
- data[begin] = data[end];// 第一处,从后开始找到第一个小于key的元素,将这个元素放到begin位置
- // key复制了原来的值,不会被覆盖)
- while (begin < end && data[begin] <= key) {
- begin++;
- }
- data[end] = data[begin];// 第二处,从前开始往后找到第一个大于key的元素,比较好begin和end的大小,将这个元素放到end位置
- }
- data[begin] = key;// 第三处,基准元素居中,将复制好的key放到中间位置
- return begin;
- }
- public void display() {
- for (int i = 0; i < data.length; i++) {
- //输出数组
- System.out.println(data[i]);
- }
- }
- public static void main(String[] args) {//重新定义一个类
- int[]num={8,1,20,15,25,6,4};
- QuickSort q=new QuickSort(num);//实例化Quicksort
- q.startSort(0, num.length-1);
- q.display();
- }