快速排序的Java实现和思路(以及我自的的反思)

我大一到大三都在学习iOS开发,对于数据结构,计算机网络,计算机操作系统这些基础中的基础实在是有点难以感兴趣,不是说不重要,相反它们都很重要,所以我已经在恶补这方面的知识。

这里我说一下我学习排序算法的一种算法的思路吧:

快速排序:

快排最中心的思想就是找到一个基准数,让其左边的数都小于它,右边的数都大于它,这样一次排序就分成了两组,但不是最终的答案,所以要进行递归左边的组和右边的组分别进行第一次的划分,这样不断递归后生成一组有序的数组。话不多说,上代码:

java:

public static void firstSort(int[] arr){

    if(arr.length == 0 || arr == null){

        return ;//这里是我的一个习惯,总是先判断数组是不是为空
    }else{

        quickSort(arr, 0, arr.length-=1)
    }

}

public static void quickSort(int[] arr, int left, int right){

    if(left<right){

        return ;
    }
    int point = partition(arr, left, right);//找基准数
    quickSort(arr, left, point-1);
    quickSort(arr, point+1, right);
}
public static void partition(int[] arr, 
int left, int right){
    int key = arr[left];
    int point = left;
    while(left<right){
        while(left<right && arr[right] >= key){
            right--;//如果大于你选定的数,则往前移一位
        }
        while(left<right && arr[left] <= key){
            left--;//如果小于等于你选定的基准数,则往后移一位
        }
        swap(arr, left, right);//交换大小数
    }
    swap(arr, point, left);//将基准数移到应该在的位置
}

public static void swap(int[] arr, int i, int j){
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}//交换函数
经过上面的代码进行递归,当left<=right的时候就结束递归,得出排好序的数组。时间复杂度为O(nlogn),对于数据比较多的数组就不适用这个算法,所以还有很多其他算法等着我们去研究。不管你是做什么的,算法一定很重要,记住这一点!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种高效的排序算法,它基于分治策略,通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有数据都比另一部分小,然后分别对这两部分继续进行排序,直到整个序列有序。在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、付费专栏及课程。

余额充值