热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法排序算法思想及实现

排序算法主要有:插入排序,选择排序,冒泡排序,希尔排序,归并排序,快速排序,堆排序

排序算法主要有:插入排序,选择排序,冒泡排序,希尔排序,归并排序,快速排序,堆排序。这里的排序指的是内部排序,也就是基于内存的排序,基于内存的排序是基于大O模型的,可以使用大O模型来衡量算法的性能
摘自我自己的博客园:www.cnblogs.com/myadmin/p/5… 中的部分排序算法。

插入排序

基本思想:每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。

原始:4 3 1 2
1) 3 4 1 2
2) 1 3 4 2
3) 1 2 3 4

核心代码:

/*** 插入排序*/public static int[] insertSort(int[] arr) {for (int i = 1; i while (index > 0 && temp return arr;}

选择排序

基本思想:从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。

3 2 1 4 6 5初始化索引位置为0
寻找最小值所在位置交换:1 2 3 4 6 5初始化索引位置为1
寻找最小值所在位置交换:1 2 3 4 6 5依次类推!

核心代码:

/*** 选择排序*/public static int[] selectSort(int[] arr) {for (int i = 0; i for (int j = i + 1; j if (arr[j] return arr;}

冒泡排序

基本思想:原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换。
核心代码:

/*** 冒泡排序* * @param arr* 输入的待排数组* @return 返回排序号的数组*/public static int[] bubbleSort(int[] arr) {for (int i = 0; i for (int j = 1; j if (arr[j - 1] > arr[j]) {int temp = arr[j - 1];arr[j - 1] = arr[j];arr[j] = temp;}}}return arr;}

希尔排序

基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2

核心代码:

/*** 希尔排序* * @author sgl* */
public class ShellSort {public static int[] shellSort(int[] arr) {int step &#61; arr.length / 2;// 初始步长while (1 <&#61; step) {for (int i &#61; step; i if (arr[i] for (int i &#61; 0; i ",");}System.out.println();}return arr;}

归并排序

基本思想&#xff1a;将待排序序列R[0...n-1]看成是n个长度为1的有序序列&#xff0c;将相邻的有序表成对归并&#xff0c;得到n/2个长度为2的有序表&#xff1b;将这些有序序列再次归并&#xff0c;得到n/4个长度为4的有序序列&#xff1b;如此反复进行下去&#xff0c;最后得到一个长度为n的有序序列。
归并排序其实要做两件事&#xff1a;
&#xff08;1&#xff09;“分解”——将序列每次折半划分。
&#xff08;2&#xff09;“合并”——将划分后的序列段两两合并后排序。

核心代码&#xff1a;

public static int[] sort(int[] nums, int low, int high) {int mid &#61; (low &#43; high) / 2;if (low return nums;}public static void merge(int[] nums, int low, int mid, int high) {int[] temp &#61; new int[high - low &#43; 1];int i &#61; low;// 左指针int j &#61; mid &#43; 1;// 右指针int k &#61; 0;// 把较小的数先移到新数组中while (i <&#61; mid && j <&#61; high) {if (nums[i] else {temp[k&#43;&#43;] &#61; nums[j&#43;&#43;];}}// 把左边剩余的数移入数组while (i <&#61; mid) {temp[k&#43;&#43;] &#61; nums[i&#43;&#43;];}// 把右边边剩余的数移入数组while (j <&#61; high) {temp[k&#43;&#43;] &#61; nums[j&#43;&#43;];}// 把新数组中的数覆盖nums数组for (int k2 &#61; 0; k2

快速排序

基本思想&#xff1a;快速排序采用的思想是分治思想。
快速排序是找出一个元素&#xff08;理论上可以随便找一个&#xff09;作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值&#xff0c;如此作为基准的元素调整到排序后的正确位置。递归快速排序&#xff0c;将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置&#xff0c;排序完成。所以快速排序算法的核心算法是分区操作&#xff0c;即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

核心代码&#xff1a;

/*** 快速排序* * &#64;author sgl* */
public class QuickSort {static void quicksort(int n[], int left, int right) {int dp;if (left while (left while (left &#61; pivot)right--;if (left while (left if (left return left;}}



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有