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

排序算法(Java)

目录

前言

常见的排序算法实现:

1. 冒泡排序

思路分析:

代码实现:

2.选择排序

思路分析:

代码实现:

3.插入排序

思路分析:

代码实现:

4.快速排序

思路分析:

代码实现:


前言

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

生活中各种地方都需要用到排序,所以学好排序算法是非常重要的。

排序分为 内部排序外部排序

内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

这部分主要是内部排序。排序讲解都以升序为例。
————————————————
版权声明:本文为CSDN博主「风继续吹TT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Edward_Asia/article/details/121419975

常见的四种排序算法:

1. 冒泡排序

2. 选择排序

3.插入排序

4.快速排序

常见的排序算法实现:

1. 冒泡排序

思路分析:

1.两两相邻元素比较,大的元素往后移,直到让最大的元素在最后面

2.当有n个元素时,外循环会进行(n-1)次排序,因为最后剩下一个数,不需要比较

3.当进行第i趟排序时,内循环会进行n-i次比较

代码实现:

 //冒泡排序public void  BubbleSort( int[] arr){//整体思路:通过每一次循环的比较找到最大值int n=arr.length;//外层排序n-1次for(int i=0;i<n-1;i++){//内层比较n-i-1次for(int j=0;j<n-i-1;j++){if(arr[j]>arr[j+1])//交换相邻的两个数组,将大的往后排{int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}

2.选择排序

思路分析:

1.首先,找到数组中最大(小)的那个元素;
2.其次,将它和数组的第一个元素交换位置(如果第一个元素就是最大(小)元素那么它就和自己交换);
3.再次,在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。

总结:这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最大(小)者

代码实现:

 //选择排序public void SelectSort ( int[] arr){int n=arr.length;//整体思路;内循环找到最小值的下标,与第一个数交换,重复找小,交换for(int i=0;i<n-1;i++){int minIndex=i;for(int j=i+1;j<n;j++){if(arr[j]<arr[minIndex])//如果此时minIndex索引处的值不是最小的,交换{minIndex=j;}}//交换arr[i]和arr[minIndex]int temp=arr[i];arr[i]=arr[minIndex];arr[minIndex]=temp;}}

3.插入排序

思路分析:

1.对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
2.为了给要插入的元素腾出空间,我们需要将插入位置之后的已排序元素在都向右移动一位。
3.插入排序所需的时间取决于输入中元素的初始顺序。例如,对一个很大且其中的元素已经有序(或接近有序)的数组
4.进行排序将会比对随机顺序的数组或是逆序数组进行排序要快得多

代码实现:

 //插入排序public void InsertSort(int[] arr){int n=arr.length;//整体思路:从认为第一个元素有序开始,依次将后面的元素插入到这个有序序列中来,直到整个序列有序为止for(int i=1;i<n;i++)//从第二个元素开始遍历{int key = arr[i];//当前插入的元素int j = i - 1;while (j >= 0 && arr[j] > key)//将key插入到前面有序数组的合适位置{arr[j + 1] = arr[j];//把arr[j]后移一位j--;//j减1继续比较,直到找到合适的位置}arr[j + 1] = key;}}

4.快速排序

思路分析:

1.将待排序的序列找一个基准值(通常选最两边)

2.采用递归的思想,将小于基准值的放在他前面,大于基准值的在他后面

代码实现:

//快速排序public  static void QuickSort(int[] arr)//对外提供的排序方法,方便用户调用{QuickSort(arr,0,arr.length-1);}//用递归排序对数组进行分区,小于基准点的在左边,大于基准点的在右边private static int Partition(int[] arr, int left, int right){int pivot = arr[right];//选择最右边为基准点int i = left-1;//初始一个小于元素边界的变量for(int j=left;j<right;j++){if(arr[j]<=pivot)//如果当前元素小于基准点{i++;//交换arr[i]和arr[j],将小于基准点的元素放在前面int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}//将基准点放在正确的位置上,既i+1int temp = arr[i+1];arr[i+1] = arr[right];arr[right] = temp;return i+1;//返回基准点的最终位置aaaaaalaakka}
//-------------------------------------------------------------------private  static  void QuickSort(int[] arr,int left,int right)//核心的递归排序方法,left表示当前排序的左边界,right表示用边界{if(left<right){int pivot=Partition(arr,left,right);QuickSort(arr,left,pivot-1);//对基准点左边进行递归排序QuickSort(arr,pivot+1,right);//对基准点右边进行递归排序}}


文章转载自:

http://qoo1d0wK.qLkjh.cn
http://Tz5bpYlg.qLkjh.cn
http://Fiu7K84X.qLkjh.cn
http://6cwBfyER.qLkjh.cn
http://w7QPM9PV.qLkjh.cn
http://34kF2b7Q.qLkjh.cn
http://GaLr9WJ6.qLkjh.cn
http://uX0CbK8g.qLkjh.cn
http://nfxo3Htj.qLkjh.cn
http://ZJMpRv8F.qLkjh.cn
http://vZGiZWEn.qLkjh.cn
http://v3CKyjD1.qLkjh.cn
http://zsMLUTkC.qLkjh.cn
http://kkQvG0KM.qLkjh.cn
http://VhutwuAc.qLkjh.cn
http://HFpBn36z.qLkjh.cn
http://42mN50eM.qLkjh.cn
http://XsIcXRfM.qLkjh.cn
http://VgKYQYbQ.qLkjh.cn
http://nCtCwM5n.qLkjh.cn
http://gibZtvJ9.qLkjh.cn
http://CUAorM0I.qLkjh.cn
http://8hWJse61.qLkjh.cn
http://aF6qRVYh.qLkjh.cn
http://JR3ld65H.qLkjh.cn
http://N6eQFrdk.qLkjh.cn
http://gPCdZ6Ve.qLkjh.cn
http://BLtdagdb.qLkjh.cn
http://In2ZroJR.qLkjh.cn
http://ibp3HZWA.qLkjh.cn
http://www.dtcms.com/a/375587.html

相关文章:

  • Oracle数据库
  • 腾讯开源智能体框架Youtu-agent全解析:特性、架构与实战指南
  • 【2511系统分析师备考-快速阅读一】
  • Vue 学习随笔系列二十五 -- 多文件上传并支持修改
  • 从0到1学习Vue框架Day03
  • 【Redis五种数据类型】
  • Redis 双向同步如何避免循环?【附实操演示】
  • Redis单线程模型为什么快?
  • At least one <template> or <script> is required in a single file component
  • 不止是DELETE:MySQL多表关联删除的JOIN语法实战详解
  • 动态控制rabbitmq中的消费者监听的启动和停止
  • C# 基于halcon的视觉工作流-章30-圆圆距离测量
  • Android Studio 构建项目时 Gradle 下载失败的解决方案
  • 【STM32项目开源】STM32单片机智能恒温箱控制系统
  • 苹果ios的系统app应用WebClip免签应用开源及方式原理
  • Java数据库连接JDBC完全解析
  • Node-RED 究竟是否适合工业场景?
  • zephyr开发环境搭建
  • OpenCV 实战:基于模板匹配的身份证号自动识别系统
  • java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
  • CMake工程指南
  • 单北斗GNSS该如何在变形监测中发挥最大效能?
  • 大数据毕业设计-基于大数据的高考志愿填报推荐系统(高分计算机毕业设计选题·定制开发·真正大数据)
  • 分布式锁redis
  • Java学习之——“IO流“的进阶流之转换流的学习
  • git 如何直接拉去远程仓库的内容且忽略本地与远端不一致的commit
  • 每日一算:分发糖果
  • 神经算子学习
  • AI大模型入门1.1-python基础字符串代码
  • Tlias管理系统(多表查询-内连接外连接)