首页 > 编程语言 >排序算法总结

排序算法总结

时间:2023-08-23 15:44:42浏览次数:46  
标签:总结 right nums int startIndex 算法 pivot 排序 left

排序算法复杂度比较

 

快速排序

 基准元素的选取会影响复杂度,最坏的情况可能到 O(n2

  • 选取区间起始元素
  • 选取区间结束元素
  • 在区间内随机选取一元素
public class Sort_QuickSort {

    public static void main(String[] args) {
        int[] nums = new int[]{6,9,1,4,8,2,5,7,6};
        Sort_QuickSort quickSort = new Sort_QuickSort();
        quickSort.quickSort(nums, 0, nums.length-1);
        for (int i=0;i< nums.length;i++) {
            System.out.print(nums[i] + " ");
        }
    }

    public void quickSort(int[] nums, int startIndex, int endIndex) {
        if (startIndex >= endIndex) {
            return;
        }
        int pivot = partition(nums, startIndex, endIndex);
        // pivot 左边的元素都比它小,右边的元素都比它大
        // 递归对 pivot 左半做相同的操作
        quickSort(nums, startIndex, pivot-1);
        // 递归对 pivot 右半做相同的操作
        quickSort(nums, pivot+1, endIndex);
    }


    private int partition(int[] nums, int startIndex, int endIndex) {
        // 最后要达到的效果是,pivot 左边的元素都比它小,右边的元素都比它大
        // 选取数组的第一个元素作为基准元素 pivot
        int pivotIndex = startIndex;
        int pivot = nums[pivotIndex];
        // 左右指针
        int left = startIndex;
        int right = endIndex;
        while (true) {
            // 在右边 找到第一个小于 pivot 的
            while (nums[right] >= pivot && left < right) {
                right--;
            }
            // 在左边找到第一个大于 pivot 的
            while (nums[left] <= pivot && left < right) {
                left++;
            }
            if (left < right) {
                // 交换左右两边
                swap(nums, left, right);
            }
            else {
                // 退出循环
                break;
            }
        }
        // 把最后的位置和 pivot 的位置交换
        swap(nums, left, pivotIndex);
        // 返回最后的位置(现在放的是pivot)
        return left;
    }

    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
}

 

堆排序

 

标签:总结,right,nums,int,startIndex,算法,pivot,排序,left
From: https://www.cnblogs.com/suBlog/p/17651841.html

相关文章

  • 基于机器视觉工具箱的车辆检测计数算法matlab仿真
    1.算法理论概述1.1、研究背景      随着城市化进程的加速和汽车保有量的增加,交通拥堵和交通事故等交通问题日益突出,如何对城市交通进行有效管理和调控成为了城市交通管理的重要任务。车辆检测计数是交通管理中的一个重要问题,它可以用于交通状况的监测、交通流量的统计以......
  • Lnton羚通视频算法算力云平台【PyTorch】教程:学习基础知识如何保存和加载模型
    保存和加载模型是指将训练好的神经网络模型保存到文件中,以便在需要时重新加载该模型进行预测、推断或继续训练。保存模型的过程是将模型的参数和其他相关信息(如优化器状态等)保存到文件中。通过保存模型,我们可以在不重新训练的情况下保留模型的状态,方便后续使用。加载模型的过程是从......
  • 文心一言 VS 讯飞星火 VS chatgpt (80)-- 算法导论7.4 5题
    五、如果用go语言,当输入数据已经“几乎有序”时,插入排序速度很快。在实际应用中,我们可以利用这一特点来提高快速排序的速度。当对一个长度小于k的子数组调用快速排序时,让它不做任何排序就返回。当上层的快速排序调用返回后,对整个数组运行插人排序来完成排序过程。试证明:这一排序......
  • LeetCode 算法题解之 26 进制转换 All In One
    LeetCode算法题解之26进制转换AllInOne26进制转换171.ExcelSheetColumnNumber171.Excel工作表列号functiontitleToNumber(columnTitle:string):number{//如何动态生成字典✅26进制//A-Z->1-26conststrs='ABCDEFGHIJKLMNOPQRSTUVWXYZ';......
  • 昨晚做梦面试官问我三色标记算法
    本文已收录至GitHub,推荐阅读......
  • 【算法学习笔记】max-min容斥 极值反演
    max-min容斥(极值反演)即为下式;\[\begin{equation}\max\{S\}=\sum_{T\subseteqS}(-1)^{|T|+1}\min\{T\}\label{aa}\end{equation}\]\[\begin{equation}\min\{S\}=\sum_{T\subseteqS}(-1)^{|T|+1}\max\{T\}\label{ab}\end{equation}\]证明:证明\(\ref......
  • 【操作系统-进程】进程的调度算法
    目录0进程调度算法的性能指标1【非抢占式】先来先服务(FCFS)调度算法2【非抢占式+抢占式】短进程优先(SPF)调度算法2.1【非抢占式】短进程优先(SPF)调度算法2.2【抢占式】最短剩余时间(SRTN)优先算法3【非抢占式】高响应比优先(HRRN)调度算法4【抢占式】时间片轮转(RR)调度算法案例一:时......
  • 4G模块信号强弱测试总结
      wcdma_rssi(接受信号强度指示)资料依据:在CDMA网络中,RSSI的范围在-110dbm—-20dbm之间。一般来说,如果RSSI<-95dbm,说明当前网络信号覆盖很差,几乎没什么信号;-95dmb<RSSI<-90dbm,说明当前网络信号覆盖很弱;RSSI〉-90dbm,说明当前网络信号覆盖较好。所以,一般都是以-90dbm为临界点,......
  • 昨晚做梦面试官问我三色标记算法
    本文已收录至GitHub,推荐阅读......
  • 聚焦重要数据价值丨DolphinDB 降采样算法介绍
    1.绪论在真实的业务场景中,时间序列数据具有以下特点:采集频率(秒级甚至毫秒级)高,导致数据量非常庞大。数据价值密度低。对数据进行合理的降采样不仅极大地可以降低系统压力、节约存储成本,同时也可以帮助用户聚焦重要信息,提升数据价值。本教程将以要点感知算法为例介绍如何在DolphinD......