使用列表和递归完成快速排序(java)

话不多说先上代码

先是划分部分的代码

 public List quicksort(List list) {//对传入的列表开始划分。
        int mind;
        List left = new ArrayList();
        List right = new ArrayList();

        if (list.size() < 2) {//传入一个值或者是空值就直接返回(弹出)。
            return list;
        } else {
            mind = (int) list.get(0);
            for (int i = 1; i < list.size(); i++) {//出入值大于等于两个就以中间值为基准开始划分。
                if ((int)list.get(i) <= mind) {
                    left.add(list.get(i));//比中间值小的全放到左边。
                } else {
                    right.add(list.get(i));//大的就放右边。
                }
            }
        }

对于传入的列表我们先进行判断,如果元素个数是一个或者没有那这个列表就完全没有排序的必要了直接返回就可以了,剩下的情况就是元素个数在两个或两个以上了。
先把第一个元素设置为关键值(我个人喜欢叫做中间值),然后以关键值为基准进行判断,把所有小于关键值的元素全放到关键值左边,大于的就放到右边。
还有,我们对于值放到左边或者右边是否需要排好序完全不用关心,你只要放就行了。
然后是递归部分代码

List newlist = new ArrayList();//一个新的列表由左值+中值+右值所组成
        newlist.addAll(quicksort(left)); //左边的所有值都比中中值小,再对每一个左值在进行一次划分,直到没有值或者只有一个值就弹出。
        newlist.add(mind);//中值只是一个元素,是一个标准。
        newlist.addAll(quicksort(right));//和左值一样。

递归部分的代码就是排序的主要操作员了。
首先,我们假设手里有三个元素的列表{5,2,9},然后个列表是由一个含有更多元素的列表中分出来的子列——也可以看作是原始列表的左值。将这个子列表放入newlist.addAll(quicksort(left)); 这里。这样第一步完成。
其次,程序会执行划分部分的代码在划分出两个子列表——左值和右值。
最后一定会有一个含有一个元素或者是空的列表,这时递归结束开始返回。
还是上面那三个元素,我开始划分一下,假设已经把它们放到划分代码里。
我们会得到这样的过程:left={2};mind=5;right={9}。看到这里应该会很清楚了,代码其实已经排序好了,但是我还是要运行一次,quicksort(left)会返回2,quicksort(right)会返回9,然后我们自己调整一下顺序加到一个新的列表在返回出去。
最后,一个排序好的子列表就完成了。

最后是完整代码

import java.util.ArrayList;
import java.util.List;

public class Sort {
    public static void main(String arg[]) {
        int[] a = {33, 55, 22, 0, 33, 77};
        List list = new ArrayList();
        for (int x:a){
            list.add(x);
        }
        System.out.println(new Sort().quicksort(list));
    }

    public List quicksort(List list) {//对传入的列表开始划分。
        int mind;
        List left = new ArrayList();
        List right = new ArrayList();

        if (list.size() < 2) {//传入一个值或者是空值就直接返回(弹出)。
            return list;
        } else {
            mind = (int) list.get(0);
            for (int i = 1; i < list.size(); i++) {//出入值大于等于两个就以中间值为基准开始划分。
                if ((int)list.get(i) <= mind) {
                    left.add(list.get(i));//比中间值小的全放到左边。
                } else {
                    right.add(list.get(i));//大的就放右边。
                }
            }
        }

        List newlist = new ArrayList();//一个新的列表由左值+中值+右值所组成
        newlist.addAll(quicksort(left)); //左边的所有值都比中中值小,再对每一个左值在进行一次划分,直到没有值或者只有一个值就弹出。
        newlist.add(mind);//中值只是一个元素,是一个标准。
        newlist.addAll(quicksort(right));//和左值一样。

        return newlist;
    }
}

注:快速排序里需要操作很多集合,如果使用数组将会使代码变得难以理解和复杂,因为数组长是固定不可变的,但是我们却需要一个长度最好不固定的集合。既然java有list这个对需要频繁操作集合超级友好的类,干嘛不用它呢??!!!

快速排序是一种高效的排序算法,它基于分治策略,通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有数据都比另一部分小,然后分别对这两部分继续进行排序,直到整个序列有序。在Java中,快速排序既可以用递归实现,也可以用循环遍历实现。 **递归实现**: ```java public class QuickSortRecursion { public void quickSort(int[] arr, int low, int high) { if (low < high) { int pivotIndex = partition(arr, low, high); quickSort(arr, low, pivotIndex - 1); // 对左半部分递归排序 quickSort(arr, pivotIndex + 1, high); // 对右半部分递归排序 } } private int partition(int[] arr, int low, int high) { int pivot = arr[high]; // 选择最后一个元素作为基准 int i = (low - 1); // 指针,初始指向左侧 for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; // 如果当前元素小于基准,向右移动指针 swap(arr, i, j); } } swap(arr, i + 1, high); // 将基准放到正确的位置 return i + 1; } private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } ``` **遍历实现**: ```java public class QuickSortIteration { public void quickSort(int[] arr) { int len = arr.length; if (len <= 1) return; // 基线条件:长度为1或0的数组已经排序 stackify(arr, 0, len - 1); // 使用栈模拟递归过程 while (!stack.isEmpty()) { pivotSort(arr, stack.pop(), stack.pop()); } } private void stackify(int[] arr, int low, int high) { while (low < high) { push(stack, low, high); while (!stack.isEmpty() && lessThan(arr, stack.peek(0), stack.peek(1))) { pivotSort(arr, stack.pop(), high); high--; } while (!stack.isEmpty() && lessThan(arr, low, stack.peek(0))) { pivotSort(arr, low, stack.pop()); low++; } } } private void pivotSort(int[] arr, int pivotStart, int pivotEnd) { int pivot = arr[pivotEnd]; int i = pivotStart - 1; for (int j = pivotStart; j < pivotEnd; j++) { if (arr[j] <= pivot) { i++; swap(arr, i, j); } } swap(arr, i + 1, pivotEnd); } // 其他辅助方法... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值