当前位置: 首页 > article >正文

【数据结构】交换排序

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:浅谈数据结构
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

冒泡、快速排序

  • 1. 冒泡排序
  • 2. 快速排序

在这里插入图片描述

1. 冒泡排序

交换排序基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。
在这里插入图片描述

代码实现:

    /*
    *冒泡排序
    *1.时间复杂度:O(N^2)
    *2.空间复杂度:O(1)
    *3.稳定性:稳定
    * @param array
     */
    public static void bubbleSort(int[] array){
    //i:记录躺数
    //j<array.length-i-1: -1 为了防止越界
        for(int i=0;i<array.length;i++){
            for(int j=0;j<array.length-i-1;j++){
                if(array[j+1]<array[j]){
                    int tmp=array[j+1];
                    array[j+1]=array[j];
                    array[j]=tmp;
                }
            }
        }
    }

2. 快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其**基本思想为:**任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。在这里插入图片描述

代码实现:

/**
     * 快速排序-》
     * 时间复杂度:
     *       最好的情况下:O(N*logN)
     *       最坏情况下:O(N^2) 逆序/有序
     * 空间复杂度:
     *       最好的情况下:O(logN)
     *       最坏情况下:O(N) 逆序/有序
     * 稳定性:不稳定
     * @param array
     */
// 假设按照升序对array数组中[left, right)区间中的元素进行排序
void QuickSort(int[] array, int left, int right)
{
	if(right - left <= 1)
	return;
	// 按照基准值对array数组的 [left, right)区间中的元素进行划分
	int div = partion(array, left, right);
	// 划分成功后以div为边界形成了左右两部分 [left, div) 和 [div+1, right)
	// 递归排[left, div)
	QuickSort(array, left, div);
	// 递归排[div+1, right)
	QuickSort(array, div+1, right);
}
private static void swap(int[] array,int i,int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}

上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,在写递归框架时可想想二叉树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。

将区间按照基准值划分为左右两半部分的常见方式有:
1. Hosre版

/**
     * @param array
     * @param left
     * @param right
     * @return
     */
    public static int partion(int[] array,int left,int right){
        int i=left;
        int privot=array[left];//基准元素
        while(left<right){
        //大于privot的放在右边,小于的放在左边
            while(left<right&&array[right]>=privot){
                right--;
            }
            while(left<right && array[left]<=privot){
                left++;
            }
            swap(array,right,left);//right<privot<left
        }
        swap(array,i,left);//将基准元素放回
        return left;
    }

2. 挖坑法

先将一个数据存放在临时变量key中,形成一个空缺位。一般选取第一个元素。

/**
     * 挖坑法
     * @param array
     * @param left
     * @param right
     * @return
     */
    public static int partion(int[] array,int left,int right){
        int privot=array[left];
        while(left<right){
            //从右边开始
            while(left<right&&array[right]>=privot){
                right--;
            }
            array[left]=array[right];
            while(left<right&&array[left]<=privot){
                left++;
            }
            array[right]=array[left];
        }
        array[left]=privot;//将基准元素填入空位
        return left;
    }

3. 前后指针法

初始时,设置两个指针。prev指向序列开头,cur指针指向prev的后一个位置

/**
     * 前后指针法:
     * @param array
     * @param left
     * @param right
     * @return
     */
    public static int partion(int[] array,int left,int right){
        int prev=left;
        int cur=left+1;
        while(cur<=right){
            while(array[cur]<array[left] &&array[cur]!=array[++prev]){
                swap(array,prev,cur);
            }
            cur++;
        }
        swap(array,prev,left);
        return prev;
    }

以上3种方式,每次划分之后的前后顺序有可能是不一样的


http://www.kler.cn/news/107562.html

相关文章:

  • 假如我有一台服务器
  • python+requests接口自动化测试框架
  • 性能测试工具——Jmeter的安装【超详细】
  • 线扫相机DALSA--分频倍频计算公式及原理
  • pycharm运行R语言脚本(win10环境下安装)
  • docker 部署tig监控服务
  • 多测师肖sir_高级金牌讲师_python+pymyql数据库
  • Maven入门与开箱即用
  • P3370 【模板】字符串哈希
  • Python基于微博的舆情分析、热搜可视化系统
  • 报错:SSL routines:ssl3_get_record:wrong version number
  • 缺少d3dx9_43.dll怎么解决 win系统如何运行dll文件?
  • TensorFlow学习:使用官方模型和自己的训练数据进行图片分类
  • Redis(02)| 数据结构-SDS
  • Spring Boot进阶(90):使用Spring Boot整合Curator,实现分布式锁,确保多个节点对同一资源的访问不会出现冲突
  • 【鸿蒙软件开发】ArkTS基础组件之Gauge(环形图表)、LoadingProgress(动态加载)
  • webGL编程指南 第五章 MultiAttributeSize
  • Golang Struct 继承的深入讨论和细节
  • SQL group by、where和having语句用法
  • 20231027 比赛总结
  • CAx软件中若干C++日志库
  • 报错:Could not resolve host: mirrorlist.centos.org;Unknown error
  • 微信小程序设置 wx.showModal 提示框中 确定和取消按钮的颜色
  • LabVIEW开发TDS1000 和TDS2000 系列泰克示波器
  • React JSX常用语法总结
  • Python Selenium 之数据驱动测试的实现!
  • 【目标跟踪】多目标跟踪测距
  • 产品经理-关于B端与C端
  • MySQL主从复制(基于GTID--事务ID方式)
  • C51--单片机中断