Java 基本排序算法

二分查找法

二分查找也称为折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。

特别注意: 二分法只适用于有序的数据,也就是说,数据必须是从小到大,或是从大到小排序的。

	/**
* 二分查找法
* 基本思想:假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,
* 如果两者相等,则查找成功,否则利用中间位置记录将表分成前、后两个字表,
* 如果中间位置记录的关键字大于查找关键字,则进一步查找前一字表,反之
* 则进一步查找后一字表,重复以上过程,直到找到满足条件的记录。
*/
private static int binarySerach(int[] array, int num) {
// TODO Auto-generated method stub
if(num<array[0] || num>array[array.length-1]) {
return -1;
}
int begin = 0;
int end = array.length;
int mid = (begin+end)/2;
while(begin<end) {
mid = (begin+end)/2;
if(num>array[mid]) {
begin = mid+1;
}else if(num<array[mid]) {
end = mid - 1;
}else {
return mid;
}
}
return -1;
}

冒泡排序

冒泡排序算法是所有排序算法中最简单、最基础的一个,它的实现思路是通过相邻数据的交换达到排序的目的。

执行流程: 对数组中相邻的数据,依次进行比较;如果前面的数据大于后面的数据,则把前面的数据交换到后面。经过一轮比较之后,就能把数组中最大的数据排到数组的最后面了;再用同样的方法,把剩下的数据逐个进行比较排序,最后得到就是从小到大排序好的数据。

/**
* 冒泡排序法
* 基本思想:重复地走过要排序的数列,比较两个相邻的元素,
* 将值大的元素交换至右端(从小至大),直至元素有序为止。
*/
private static void buddleSort(int[] array) {
// TODO Auto-generated method stub
for(int i=0;i<array.length-1;i++) {
for(int j=0;j<array.length-1-i;j++) {
if(array[j]>array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}

选择排序

选择排序算法也是比较简单的排序算法,其实现思路是每一轮循环找到最小的值,依次排到数组的最前面,这样就实现了数组的有序排列。

执行流程:

  • 初始化数据:18,1,6,27,15

  • 第一轮排序:1,18,6,27,15

  • 第二轮排序:1,6,18,27,15

  • 第三轮排序:1,6,15,27,18

  • 第四轮排序:1,6,15,18,27

      /**
    * 选择排序法
    * 基本思想:每一趟从待排序的记录中选出最小的记录,
    * 放在序列的起始位置,然后再从剩余的未排序元素寻找最小元素,
    * 放到已排序的序列的末尾,重复此过程,直到全部记录排序完毕。
    */
    private static void selectSort(int[] array) {
    // TODO Auto-generated method stub
    for(int i=0;i<array.length-1;i++) {
    for(int j=i+1;j<array.length;j++) {
    if(array[i]>array[j]) {
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
    }
    }
    }
    }

插入排序

插入排序算法是指依次把当前循环的元素,通过对比插入到合适位置的排序算法。

执行流程:

  • 初始化数据:18,1,6,27,15

  • 第一轮排序:1,18,6,27,15

  • 第二轮排序:1,6,18,27,15

  • 第三轮排序:1,6,18,27,15

  • 第四轮排序:1,6,15,18,27

      /**
    * 插入排序法
    * 基本思想:每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,
    * 直到所有元素排完为止。
    */
    private static void insertSort(int[] array) {
    // TODO Auto-generated method stub
    for(int i=1;i<array.length;i++) {
    int index = i-1;
    int temp = array[i];
    while(index>=0 && array[index]>temp) {
    array[index+1] = array[index];
    index--;
    }
    array[index+1] = temp;
    }
    }

快速排序

快速排序算法是基于交换排序思想实现的,是对冒泡排序算法的改进,从而具有更高的执行效率。

快速是通过多次比较和交换来实现排序的执行流程如下:

  • 首先设定一个分界值,通过该分界值把数组分为左右两个部分;

  • 将大于等于分界值的元素放到分界值的右边,将小于分界值的元素放到分界值的左边;

  • 然后对左边两边的数据进行独立的排序,在左边数据中取一个分界值,把小于分界值的元素放到分界值的左边,大于等于分界值的元素,放到数组的右边;右边的数据也执行同样的同样的操作;

  • 重复上述操作,当左边各数据排序完成后,整个数组也就完成了排序。

      /**
    * 快速排序法
    * 基本思想:选择一个值作为基准值,比基准值小的都在左边,
    * 大的放在右边,一般选择序列的第一个元素为基准值,然后分为两组,
    * 再找基准值,进行以上比较、重复,一直到所有元素排完为止。
    */
    private static void quickSort(int[] array, int start, int end) {
    // TODO Auto-generated method stub
    if(start>end) {
    return;
    } int key = array[start];
    int i = start;
    int j = end; while(i<j) {
    while(i<j&&array[j]>=key) {
    j--;
    }
    while(i<j&&array[i]<=key) {
    i++;
    } if(i<j) {
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
    } } array[start] = array[i];
    array[i] = key; quickSort(array, start, i-1);
    quickSort(array, i+1, end); }

补张图

待更新,路过点个赞…

Java实现四大基本排序算法和二分查找的更多相关文章

  1. PHP四大基本排序算法实例

    PHP四大基本排序算法包括:冒泡排序法,快速排序法,选择排序法,插入排序法. 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往 ...

  2. Java 的八种排序算法

    Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...

  3. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...

  4. 分治算法(二分查找)、STL函数库的应用第五弹——二分函数

    分治算法:二分查找!昨天刚说不写算法了,但是突然想起来没写过分治算法的博客,所以强迫症的我…… STL函数库第五弹——二分函数lower_bound().upper_bound().binary_se ...

  5. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...

  6. 数据结构(三) 用java实现七种排序算法。

    很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...

  7. 《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

    根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: ...

  8. Java实现十个经典排序算法(带动态效果图)

    前言 排序算法是老生常谈的了,但是在面试中也有会被问到,例如有时候,在考察算法能力的时候,不让你写算法,就让你描述一下,某个排序算法的思想以及时间复杂度或空间复杂度.我就遇到过,直接问快排的,所以这次 ...

  9. java基础---数组的排序算法(3)

    一.排序的基本概念 排序:将一个数据元素集合或序列重新排列成按一个数据元素某个数据项值有序的序列 稳定排序:排序前和排序后相同元素的位置关系与初始序列位置一致(针对重复元素来说,相对位置不变) 不稳定 ...

随机推荐

  1. SpringBoot使用@Scheduled创建定时任务

    定时任务一般会存在中大型企业级项目中,为了减少服务器.数据库的压力往往会采用时间段性的去完成某些业务逻辑.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回 ...

  2. wpf toggleSwitch 的只读属性

    xml code --------------------------------------------- <Page x:Class="UWPDemo.MainPage" ...

  3. 徒手撸一个简单的RPC框架

    来源:https://juejin.im/post/5c4481a4f265da613438aec3 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的 ...

  4. Linux下用gdb 调试、查看代码堆栈

      Linux中用gdb 查看代码堆栈的信息 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的. 调试的话输入: gd ...

  5. Servlet、ServletContext与ServletConfig的详解及区别

    Servlet.ServletContext与ServletConfig的详解及区别 一.Servlet详解 Servlet是一个interface,全局限定名:javax.servlet.Servl ...

  6. Jmeter教程 录制脚本

    Jmeter 录制脚本 Jmeter中有2种方法可以录制脚本.  不过我个人非常不推荐录制脚本,录制的脚本混乱,需要再次加工才能使用. 像我这么精通HTTP协议的人. 一直都是使用Fiddler来抓包 ...

  7. Docker与数据:三种挂载方式

    操作系统与存储 操作系统中将存储定义为 Volume(卷) ,这是对物理存储的逻辑抽象,以达到对物理存储提供有弹性的分割方式.另外,将外部存储关联到操作系统的动作定义为 Mount(挂载). Dock ...

  8. MySQL存储结构及SQL分类

    MySQL目录结构 bin -- mysql执行程序 docs -- 文档 share - 各国编码信息 data -- 存放mysql 数据文件 * 每个数据库 创建一个同名文件夹,.frm 存放t ...

  9. 洛谷P1083 借教室 题解

    题目 [NOIP2012 提高组] 借教室 题解 这道题是几周之前做到的一道题,本来不想讲的,因为这道题也是用到了二分答案的方法,这类题目之前已经发布过两篇题解了.但这道题还运用了差分数组这个思想,所 ...

  10. centos7安装privoxy

    本文分为三部分,第一部分是在阿里云的ECS上安装Privoxy,第二部分是在AWS的EC2上安装Privoxy,第三部分是Privoxy的配置. 第一部分:阿里云ECS安装Privoxy 配置yum源 ...