一:冒泡法排序 

//冒泡排序 注:从小到大排
   //特点:效率低,实现简单
  //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。

这只是冒泡排序的一种,当然也可以从后往前排。

算法步骤

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

  • 针对所有的元素重复以上的步骤,除了最后一个。

  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

动画演示

参考代码

public static void bubbleSort(int array[]) {
    int t = 0;
    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]) {
        t = array[j];
        array[j] = array[j + 1];
       array[j + 1] = t;
       }
    }

二:选择排序

    //选择排序 从小到大

//特点:效率低,容易实现。
    //思想:每一趟从待排序序列选择一个最小的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步骤直到完成排序。

算法步骤

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

  • 重复第二步,直到所有元素均排序完毕。

动画演示

参考代码

public static void selectSort(int array[]) {
     int t = 0;
     for (int i = 0; i < array.length - 1; i++){
       int index=i;
        for (int j = i + 1; j < array.length; j++)
           if (array[index] > array[j])
            index=j;
           if(index!=i){ //找到了比array[i]小的则与array[i]交换位置
             t = array[i];
             array[i] = array[index];
             array[index] = t;
             }
          }
       }

三:插入排序
     //插入排序 从小到大
     //特点:效率低,容易实现。
     //思想:将数组分为两部分,将后部分元素逐一与前部分元素比较,如果前部分元素比array[i]小,就将前部分元素往后移动。当没有比array[i]小的元素,即是                    合理位置,在此位置插入array[i]

算法步骤

  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

动画演示

参考代码

public static void insertionSort(int array[]) {
         int i, j, t = 0;
          for (i = 1; i < array.length; i++) {
             if(array[i]<array[i-1]){
              t = array[i];
             for (j = i - 1; j >= 0 && t < array[j]; j--)
             array[j + 1] = array[j];
             //插入array[i]
            array[j + 1] = t;
               }
            }
        }

四:快速排序
    //快速排序 从小到大
    //特点:高效,时间复杂度为nlogn。
    //采用分治法的思想:首先设置一个轴值pivot,然后以这个轴值为划分基准将待排序序列分成比pivot大和比pivot小的两部分,

接下来对划分完的子序列进行快排直到子序列为一个元素为止。

算法步骤

  • 从数列中挑出一个元素,称为 “基准”(pivot);

  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

动画演示

参考代码

public static void quickSort(int array[], int low, int high) {// 传入low=0,high=array.length-1;
      int pivot, p_pos, i, t;// pivot->位索引;p_pos->轴值。
       if (low < high) {
             p_pos = low;
             pivot = array[p_pos];
             for (i = low + 1; i <= high; i++)
                 if (array[i] < pivot) {
                      p_pos++;
                     t = array[p_pos];
                     array[p_pos] = array[i];
                     array[i] = t;
                }
              t = array[low];
              array[low] = array[p_pos];
              array[p_pos] = t;
              // 分而治之
             quickSort(array, low, p_pos - 1);// 排序左半部分
             quickSort(array, p_pos + 1, high);// 排序右半部分
            }
        }

 五:测试

package com.svse.paixu;
import java.util.Arrays;
public class JavaSort {

//打印方法

public static void print(int[] arr) {

  System.out.print("[");
  for (int i = 0; i < arr.length; i++) {
     if(i == arr.length-1) {
        System.out.println(arr[i] + "]");
      }else {
        System.out.print(arr[i] + ",");
      }
    }
  }

public static void main(String[] args) {
    int[] array = { 37, 47, 23, 100, 19, 56, 56, 99, 9 };

print(array);//排序前
    //JavaSort.bubbleSort(array);//冒泡排序
    //JavaSort.selectSort(array);//选择排序
    //JavaSort.insertionSort(array);//插入排序
    JavaSort.quickSort(array, 0, array.length-1);//快速排序
    System.out.println("排序后:" + Arrays.toString(array));

print(array);//排序后
    }
}

   六:各种排序算法性能比较

Java中选择排序,冒泡排序,插入排序,快速排序的更多相关文章

  1. 2017.12.9 Java中的排序---冒泡排序、快速排序、选择排序

    //冒泡排序 public class demo{ public static void main(String[] args) { int[] sum={2,9,10,1,5,88}; System ...

  2. [Java]数组排序-选择排序 冒泡排序 插入排序

    1 选择排序  原理:a 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.       b 每轮使用a的规则, 可以选择出 ...

  3. JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    一直到大四才开始写自己的第一篇博客,说来实在有点羞愧.今天写了关于排序的算法题,有插入排序,冒泡排序,选择排序,以下贴上用JAVA实现的代码: public class test5 { public ...

  4. Java ——数组 选择排序 冒泡排序

    本节重点思维导图 数组 public static void main(String[] args) { int a ; a=3; int[] b; b = new int[3];//强制开辟内存空间 ...

  5. Linux C++ 直接选择排序,冒泡排序,快速排序

    选择排序的思想是:每次从待排序中选择最小(大)的元素插入已经排好的序列中. /*直接选择排序*/ #include <iostream> using namespace std; void ...

  6. [模板]选择排序&&冒泡排序&&插入排序

    #include<iostream> #include<cstdio> #include<bits/stdc++.h> using namespace std; v ...

  7. Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析

    前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...

  8. Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

    一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...

  9. 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现

    排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...

随机推荐

  1. ASP.NET Core 中的 ORM 之 Dapper

    目录 Dapper 简介 使用 Dapper 使用 Dapper Contrib 或其他扩展 引入工作单元 Unit of Work 源代码 参考 Dapper 简介 Dapper是.NET的一款轻量 ...

  2. 基于xlua和mvvm的unity框架

    1.框架简介 这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI,于是下载下来学习了一下.XUUI基于xlua,又借鉴了mvvm的设计概念.xlua是目前很火的unity热更 ...

  3. C++ 输入、输出运算符重载

    C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型.我们可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型. 在这里,有一点很 ...

  4. 深入浅出 JVM GC(4)常用 GC 参数介绍

    # 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...

  5. 如何将一个HTML页面嵌套在另一个页面中

    一 在原页面嵌入其他页面 1.使用iframe框架 客户端页面嵌套可以使用iframe的方法,弊端是必须事先想好被嵌套的页面在首页中要占多大的位置. 如果被嵌套页面太大,超过事先定义的宽度或高度,则首 ...

  6. Strust2框架笔记01_XML配置_action编写

    目录 1.Struts2概述 1.1 什么是Struts2 1.2 Web层框架基于前端控制器模型设计 2. Struts2入门案例 2.1 Struts2的开发环境 2.2 解压开发包 2.3 创建 ...

  7. 项目开发版本控制----Git

    版本控制的工具我早之前用的svn,后来换成了git.同样是版本控制,为什么要换呢?肯定是有原因的啦~ 一.Git和SVN的比较 svn的优缺点 优点: 1.管理方便,逻辑明确,符合一般人思维习惯. 2 ...

  8. 深入理解JVM——虚拟机GC

    对象是否存活 Java的GC基于可达性分析算法(Python用引用计数法),通过可达性分析来判定对象是否存活.这个算法的基本思想是通过一系列"GC Roots"的对象作为起始点,从 ...

  9. 设计模式之观察者模式(Observer)

    观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里.观察者(Observer)和 ...

  10. js 如何移除一个匿名函数的绑定事件

    大家都知道 addEventListener的用法 绑定事件 例如 element.addEventListener(type,handler,false); element是dom元素 type是事 ...