一:冒泡法排序 

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

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

算法步骤

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

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

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

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

动画演示

参考代码

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. Zuul过滤器

    1.Zuul过滤器生命周期Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期.a.pre: 这种过滤器在请求被路由之前调用.可利用这种 ...

  2. System.Action的使用(lambda 表达式)

    对于Action的使用方法使用如下: namespace ConsoleApp1 { class Program { static void Main(string[] args) { string ...

  3. bootstrap3中container与container_fluid的区别

    .container与.container_fluid是bootstrap中的两种不同类型的外层容器,按照官方的说法,这两者的区别是: .container 类用于固定宽度并支持响应式布局的容器. . ...

  4. JavaWeb学习 (六)————Servlet(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  5. [Vijos 1676] 陶陶吃苹果

    Description curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上 ...

  6. VUE模仿百度搜索框,按上下方向键及回车键实现搜索选中效果

    逻辑介绍: 1.表单获取焦点时,显示搜索建议框 2.输入内容时,请求后台接口,并将返回的数据展示在搜索建议框内 3.表单获取焦点情况下,按键盘上下箭头可实现搜索列表项的切换,按回车可以选择当前激活的选 ...

  7. T-SQL:透视数据(十三)

    透视数据实际上就是行状态转为例状态 先加一张测试表 IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL DROP TABLE dbo.Orders; GO CREA ...

  8. hive的行列转换

    行转列(把多个行合并) 比如把: id    tag 1 12 1 23 2 67 2  78 2 76 行转列之后: id tag 1 12,23 2 67,78,76 使用函数为:concat_w ...

  9. hadoop的企业优化

    前言: Mapreduce程序的效率的瓶颈在于两点: 计算机性能: CPU.内存.磁盘健康.网络 I/O操作: 数据倾斜 map和reduce数量设置不合理 map的运行时间太长,导致reduc的等待 ...

  10. JVM内存:年轻代、老年代、永久代(推荐 转)

    参考文章: 1.Java 新生代.老年代.持久代.元空间 2.Java内存与垃圾回收调优 3.方法区的Class信息,又称为永久代,是否属于Java堆? Java 中的堆是 JVM 所管理的最大的一块 ...