Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【排序2】交换排序:让代码更优雅

【排序2】交换排序:让代码更优雅

作者头像
小舒不服输
发布于 2024-01-30 05:47:42
发布于 2024-01-30 05:47:42
19800
代码可运行
举报
文章被收录于专栏:编程乐园·编程乐园·
运行总次数:0
代码可运行
👻交换排序

🎄1、基本思想及特点

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。 特点:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

🎄2、冒泡排序

冒泡排序(Bubble Sort)是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。

如图

🪄代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void bubbleSort(int[] array) {
        //i代表趟数 10 -》 9趟
        for (int i = 0; i < array.length-1; i++) {
            boolean flg = false;
            for(int j = 0;j < array.length-1-i;j++) {
                if(array[j] > array[j+1]) {
                    swap(array,j,j+1);
                    flg = true;
                }
            }
            //没有交换证明有序了
            if(flg == false) {
                return;
            }
        }
    }

✌️【冒泡排序的特性总结】

  1. 冒泡排序是一种非常容易理解的排序
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定

🎄3、快速排序(挖坑法)

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

🔍快速排序的主要思想可以概括为以下步骤: 1、选择基准元素:从待排序的数组中选择一个元素作为基准元素(通常可以选择数组的第一个元素,但最好的选择是三数取中)。 2、分区:将数组中小于基准元素的元素放在基准元素的左边,大于基准元素的元素放在基准元素的右边,形成两个子数组。 3、递归排序:对基准元素左边的子数组和右边的子数组分别进行递归调用快速排序。 4、合并:将左边子数组、基准元素和右边子数组按顺序合并起来,形成排序后的数组。

如图

🪄代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void quickSort(int[] array) {
        quick(array,0,array.length-1);
    }
private static void quick(int[] array,int start,int end) {
        if(start >= end) {
            return;
        }
      
        int pivot = partition(array,start,end);

        quick(array,start,pivot-1);
        quick(array,pivot+1,end);
}
private static int partition(int[] array, int left, int right) {
	int i = left;
	int j = right;
	int pivot = array[left];
	while (i < j) {
		while (i < j && array[j] >= pivot) {
		j--;
		} 
		array[i] = array[j];
		while (i < j && array[i] <= pivot) {
		i++;
		} 
		array[j] = array[i];
	} 
	array[i] = pivot;
	return i;
}

🎄4、快速排序优化

🎊4.1 三数取中法选key

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static int middleNum(int[] array,int left,int right) {
        int mid = left+((right-left) >> 1);
        //int mid = (left+right)/2;
        if(array[left] < array[right]) {
            if(array[mid] < array[left]) {
                return left;
            }else if(array[mid] > array[right]) {
                return right;
            }else {
                return mid;
            }
        }else {
            if(array[mid] < array[right]) {
                return right;
            }else if(array[mid] > array[left]) {
                return left;
            }else {
                return mid;
            }
        }
    }

🎊4.2 递归到小的子区间时,可以考虑使用插入排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void insertSort2(int[] array,int start,int end) {
        for (int i = start+1; i <= end; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= start ; j--) {
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }

🪄全部代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void quickSort(int[] array) {
        quick(array,0,array.length-1);
    }
private static void quick(int[] array,int start,int end) {
        if(start >= end) {
            return;
        }

        if(end-start+1 <= 15) {
            insertSort2(array, start, end);
            return;
        }

        //1. 三数取中  index是中间大的数字 的 下标
        int index = middleNum(array,start,end);
        swap(array,index,start);

        int pivot = partition(array,start,end);//

        quick(array,start,pivot-1);
        quick(array,pivot+1,end);
}
private static int partition(int[] array,int left,int right) {
        int tmp = array[left];
        while (left < right) {
            while (left < right && array[right] >= tmp) {
                right--;
            }
            if(left >= right) {
                break;
            }
            array[left] = array[right];
            while (left < right && array[left] <= tmp) {
                left++;
            }
            if(left >= right) {
                break;
            }
            array[right] = array[left];
        }
        array[left] = tmp;
        return left;
}

 public static void insertSort2(int[] array,int start,int end) {
        for (int i = start+1; i <= end; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= start ; j--) {
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
}



  private static int middleNum(int[] array,int left,int right) {
        int mid = left+((right-left) >> 1);
        //int mid = (left+right)/2;
        if(array[left] < array[right]) {
            if(array[mid] < array[left]) {
                return left;
            }else if(array[mid] > array[right]) {
                return right;
            }else {
                return mid;
            }
        }else {
            if(array[mid] < array[right]) {
                return right;
            }else if(array[mid] > array[left]) {
                return left;
            }else {
                return mid;
            }
        }
}

🎄5、 快速排序非递归

🪄代码示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void quickSortNonR(int[] a, int left, int right) {
	Stack<Integer> st = new Stack<>();
	st.push(left);
	st.push(right);
	while (!st.empty()) {
		right = st.pop();
		left = st.pop();
		if(right - left <= 1)
			continue;
		int div = PartSort1(a, left, right);
		// 以基准值为分割点,形成左右两部分:[left, div) 和 [div+1, right)
		st.push(div+1);
		st.push(right);
		st.push(left);
		st.push(div);
	}
}

🎄6、快速排序总结

🔍

  1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(logN)
  4. 稳定性:不稳定

🎉OK!今天的分享就到这里了,后面还会分享更多排序算法,敬请关注喔!!!✌️

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据小白必看:七大排序算法超详细讲解(下)
如上图所示,从前往后找可能会使left比right更先找到比基准值大的值,然后将他们进行交换,导致左边区间可能出现比基准值大的元素
喜欢做梦
2024/12/26
1230
数据小白必看:七大排序算法超详细讲解(下)
排序大杂烩
一.排序的概念及引用: 1.排序的概念: 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 2.稳定性 :假定在待排序的记录序列中, 存在多个具有相同的关键字的记录 ,若 经过排序 ,这些 记录的相对次序保持不变 ,即在 原序列中,r[i]=r[j],排序前r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的 内部排序 :数据元素全部放在内存中的排序。 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。 3.常见的排序算法:
用户11305962
2024/10/09
710
排序大杂烩
数据结构-8.Java. 七大排序算法(中篇)
本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 中篇主要实现后三种排序算法: 冒泡排序,快速排序,下一篇讲 归并排序. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 .
用户11369350
2024/11/25
2340
数据结构-8.Java. 七大排序算法(中篇)
[数据结构]———交换排序
基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。
小李很执着
2024/06/15
1260
[数据结构]———交换排序
Java实现四大基本排序算法和二分查找
二分查找也称为折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。
呆呆
2021/10/06
1970
《Java初阶数据结构》----9.<四大七种排序算法>
上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,同学们在写递归框架时可想想二叉树前序 遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。 将区间按照基准值划分为左右两半部分的常见方式有
用户11288958
2024/09/24
1170
《Java初阶数据结构》----9.<四大七种排序算法>
排序算法详解
插入排序是一种简单直观的排序算法,它的原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
2的n次方
2024/10/15
820
排序算法详解
【数据结构】排序
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
xxxflower
2023/04/16
2840
【数据结构】排序
【数据结构】关于快速排序,归并排序,计数排序,基数排序,你到底了解多少???(超详解)
比较算法通过比较元素的大小来确定它们的相对顺序。常见的比较排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等,本期小编将讲述快速排序,归并排序。
用户11288949
2024/09/24
1100
【数据结构】关于快速排序,归并排序,计数排序,基数排序,你到底了解多少???(超详解)
常用排序算法代码兑现
主要推送关于对算法的思考以及应用的消息。坚信学会如何思考一个算法比单纯地掌握100个知识点重要100倍。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。 01 — 回顾 五天过去了,8个主要排序算法的思想和原理图解都已经推送完了,在这些推送中,我们详细分析讨论了 各种排序算法的时间、空间复杂度; 算法的稳定性; 算法的优化改进 算法的应用场景 如果您想了解或者进一步熟悉下这些算法原理,请参考之前五天的推送: 冒泡排序到快速排序做的那些优化 直接选择排序到堆排序做的那些改进 直接插入排序到
double
2018/04/02
7240
八大排序详解
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
waves浪游
2024/09/30
1780
八大排序详解
手搓交换排序、归并排序、计数排序
快速排序是一种二叉树结构的交换排序方式,基本思想:任取待排元素序列中的某元素作为基准值,按照该基准值将待排序列分割成两子序列,左子序列所有元素均小于该基准值,右子序列均大于该基准值,然后在左子序列,和右子序列重复上述过程,直到待排元素符合预期结果。
技匠晓晨
2024/11/26
1310
手搓交换排序、归并排序、计数排序
纯碎coding:7个最常用的排序算法
1统一符号表达 算法中使用的交换函数,代码如下, 1 //swap element at i to at j 2 private static void swap(int[] array, int i,int j){ 3 int tmp = array[i]; 4 array[i] = array[j]; 5 array[j] = tmp; 6 } 以下 7 种排序算法都实现了序列的非降序排列,函数参数代表的含义一般统一定义为: array: 待排序的
double
2018/07/31
3370
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
  冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的:
全栈程序员站长
2022/09/14
8720
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
这里如果max的最大值为0下标的时候,max已经被 minIndex交换,maxIndex等于minIndex获取最大元素的下标值即可。
如烟花般绚烂却又稍纵即逝
2024/12/26
2470
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
那些年,让我面试头大的几个排序算法,今天终于搞懂了!
算法上,最基础的就是排序算法,几乎在面试中,或多或少会要求你手写一些基础算法。今天鱼哥带大家这些基础算法回顾下。
AI科技大本营
2019/05/22
3860
算法笔记之排序
最近在看《算法笔记》,如果单从算法来说,这本书真正做到了短小精悍,首先以排序入题,那么我们今天也来说说排序。 排序 将一堆杂乱无章的元素按照某种规则有序排列的过程就叫“排序”.排序是一种非常基础的算法,有着广泛的理论和实践基础。对一个排序算法来说,一般从如下3个方面衡量算法的优劣: 时间复杂度:主要是分析关键字的比较次数和记录的移动次数。 空间复杂度:分析排序算法中需要多少辅助内存 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种算法是稳定的;反之,就是不稳定的。 排序算法
xiangzhihong
2018/02/05
9450
算法笔记之排序
[数据结构] 万字解析排序算法
快速排序(Quick Sort)是一种高效的排序算法,它利用分治法将一个数组分成两个子数组,然后递归地对这两个子数组进行排序。在快速排序的每一趟排序中,核心步骤是单趟循环,这一步骤将数组分成两分,一部分的所有元素都小于等于一个特定的“基准值”(pivot),另一部分的所有元素都大于基准值。
DevKevin
2024/08/09
1570
[数据结构] 万字解析排序算法
排序算法对比,步骤,改进,java代码实现
发现是时候总结一番算法,基本类型的增删改查的性能对比,集合的串并性能的特性,死记太傻了,所以还是写在代码里,NO BB,SHOW ME THE CODE!
ydymz
2018/09/10
5550
排序算法对比,步骤,改进,java代码实现
排序算法之冒泡、插入、快排和选择排序
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/28
3500
推荐阅读
相关推荐
数据小白必看:七大排序算法超详细讲解(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验