java讲讲几种常见的排序算法(一)

目录

以数组array={6,3,20,8,15,1}为例

冒泡排序

思路:从第0个到第n个,和相邻的元素进行相比,如果比相邻的大的话,那么就交换二者顺序,这样的话0到n范围内的最大的数就放到n的位置。接着下一次操作,第0个到第n-1个,将0到n-1范围内的最大值放到n-1。重复执行,最后数组从小到大排列。

public static void bubble(int array[])
{
for (int i = array.length-1; i >0;i--) {
for(int j=0;j<i;j++)
{
if(array[j]>array[j+1])
{
swap(array,j+1,j);
}
}
}
}

排序过程:

3 6 8 15 1 20

3 6 8 1 15 20

3 6 1 8 15 20

3 1 6 8 15 20

1 3 6 8 15 20

选择排序

思路:遍历第i到第n个,找到i到n范围内最小的数,然后放在i的位置。接着遍历i+1到第n个,找到i+1到n范围内最小的数,然后放在i+1的位置,重复执行下去,最后数组从小到大排列。

public static void selectSort(int array[])
{
for (int i = 0; i < array.length; i++) {
int min=array[i];
int index=i;
for (int j = i; j < array.length; j++) {
if(array[j]<min)
{
min=array[j];
index=j;
}
}
swap(array,index,i);
}
}

排序过程:

1 3 20 8 15 6

1 3 20 8 15 6

1 3 6 8 15 20

1 3 6 8 15 20

1 3 6 8 15 20

1 3 6 8 15 20

插入排序

思路:如第0到5范围内的数从小到大排列,第六个数记为temp,此时第temp比第5个数小,那么第5个数往后退,接着再与第4个数比较,如果还是比第4个数小,那么第4个数继续后退,接着如果不小于第3个数,这个时候将temp存到4的位置 。总的来说,就是在一个有序范围内,插入一个该范围之外的数,随着执行下,有序范围逐渐扩大,最后整体有序。

public static void insert(int array[])
{
for (int i = 1; i < array.length; i++) {
int temp=array[i];
int j=i;
while(j>0&&temp<array[j-1])
{
array[j]=array[j-1];
j--;
}
array[j]=temp; }
}

排序过程:

3 6 20 8 15 1

3 6 20 8 15 1

3 6 8 20 15 1

3 6 8 15 20 1

1 3 6 8 15 20

希尔排序

思路:希尔排序是在插入排序的基础上进一步改进的。

插入排序有可以改进的地方

  • 插入排序每一次移动只能移动一位,而希尔排序可以按步长移动。
  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。

    所以针对这两点,希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

    总的来说,希尔排序的最后一步是插入排序,但是在插入排序之前,实现了基本有序。

public static void shell(int array[])
{
int gap=array.length/2;
//控制步长
while(gap!=0)
{ for (int i = 0; i < gap; i++) {
//插入排序
for (int j = i+gap; j < array.length; j=j+gap) {
int temp=array[j];
int p=j;
while(p>=gap&&temp<array[p-gap])
{
array[p]=array[p-gap];
p=p-gap;
}
array[p]=temp;
}
}
gap=gap/2;
}
}

快速排序

最核心的思想是实现在一个范围内,以n为基准点,左边的数不大于基准点,右边的数不小于基准点。接下来左边的作为一个整体,同样实现上面的要求,右边的作为一个整体也实现上面的要求(左边的数不大于基准点,右边的数不小于基准点)。自顶向下执行下去,最后局部有序实现整体有序。

public static void quickSort(int array[],int start,int end)
{
if(start<end)
{
int n=findPoint(array,start,end);
quickSort(array,start,n-1);
quickSort(array,n+1,end);
}
}
public static int findPoint(int array[],int start,int end)
{
int temp=array[start];
while(start<end)
{
while(start<end&&array[end]>=temp)
{
end--;
}
if(start<end)
{
array[start]=array[end];
}
while(start<end&&array[start]<=temp)
{
start++;
}
if(start<end)
{
array[end]=array[start];
}
}
array[start]=temp;
return start;
}

排序过程:

1 3 2 6 8 12 7 15 20

1 3 2 6 8 12 7 15 20

1 2 3 6 8 12 7 15 20

1 2 3 6 7 8 12 15 20

1 2 3 6 7 8 12 15 20

1 2 3 6 7 8 12 15 20

后面会继续更新几种常见排序算法。

我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)

java讲讲几种常见的排序算法的更多相关文章

  1. java讲讲几种常见的排序算法(二)

    java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...

  2. Java实现7种常见的排序算法

    数据结构中的内部排序:不需要访问外存便能完成,是一个逐步扩大记录的有序序列长度的过程. 可以分为5类: 1.插入排序:直接插入排序,稳定排序,时间复杂度为O(n^2)非递减有序,设置r[0]为哨兵进行 ...

  3. 用Java实现几种常见的排序算法

    用Java语言实现的各种排序,包括插入排序.冒泡排序.选择排序.Shell排序.快速排序.归并排序.堆排序.SortUtil等. 插入排序: package org.rut.util.algorith ...

  4. java几种常见的排序算法总结

    /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int  ...

  5. 七种常见经典排序算法总结(C++实现)

    排序算法是非常常见也非常基础的算法,以至于大部分情况下它们都被集成到了语言的辅助库中.排序算法虽然已经可以很方便的使用,但是理解排序算法可以帮助我们找到解题的方向. 1. 冒泡排序 (Bubble S ...

  6. python3实现几种常见的排序算法

    python3实现几种常见的排序算法 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  7. Java中8种常见的排序方法

    排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...

  8. Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5492298.html 在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习 ...

  9. 用php实现四种常见的排序算法

    几种常见的排序 排序是一个程序员的基本功,对于初级phper,更是可以通过排序算法来锻炼自己的思维能力. 所谓排序,就是对一组数据,按照某个顺序排列的过程.下面就总结四种常用的php排序算法,分别是冒 ...

随机推荐

  1. rip中的连续子网以及不连续子网

    RIPv1 RIPv2 距离矢量2 距离矢量 最大跳计数15 最大跳计数15 有类的 无类的 基于广播的    基于组播224.0.09 不支持VLSM 支持VLSM 无认证 允许MD5认证 不支持不 ...

  2. 【转】Linux中多线程wait使用注意

    使用管道生成的while,是无法进行并发管理的 在处理日志的时候,采用管道多线程,怎么都实现不了wait功能,经上篇文章才知道,使用管道生成的while,无法进行并发管理. while read qu ...

  3. ajax——三级联动下拉列表框的优化(简化页面,用jquery插件代替原来页面代码,返回处理数据类型为"TEXT")

    数据库: 主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  4. codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。

    限制相邻元素,求合法序列数. /** 题目:On the Bench 链接:http://codeforces.com/problemset/problem/840/C 题意:求相邻的元素相乘不为平方 ...

  5. ssh2——Interceptor拦截器

    尽管没学过struts1吧.可是了解到struts1中并没有拦截器,  到Struts2才有.它是基于WebWork发展起来的, 顾名思义,说到拦截器大家首先肯定会想到它是拦截东西的,起到一个限制的作 ...

  6. 框架Iframe的退出,IE 火狐都没问题 到360就不跳转页面 刷新一遍才跳转到登录页

    遇到这种情况 ,郁闷死了,来回折腾好几种跳转方法,最后有一个灵感,当我点击退出按钮的时候,我是用jquery $("#ID").click(function(){}) 这种方法异步 ...

  7. html 处理

    近期做了一个后台管理网站,后台页面都是Html页面,里面再通过ajax访问后台服务.要做到比较好的用户体验,即:如果用户没有登录或没有权限马上调到登录页面,而不是等到页面加载后再ajax时判断是否登录 ...

  8. 009杰信-创建购销合同Excel报表系列-2-建立购销合同(增删改查)

    前面一篇文章已经分析好了数据库的表,这篇文章针对购销合同表做一个增删改查. 和之前的表的增删该查类似. 项目结构如下:

  9. @Bean 小知识

    先说结论 @Bean 可以用在任意方法上. -- 也可以用在注解上面. @Bean 仅在Spring创建bean时起作用. 这应该算一个小技巧,在一个平常类(非@Configuration class ...

  10. Centos下使用压缩包安装MySQL5.7

    今天在自己的centos服务器上安装mysql,碰到的问题相当的多,装个mysql远比在windows复杂的多.这里通过查找的一些博文(包括前几篇)来记录安装mysql时的各种问题.可能步骤不完整,当 ...