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. Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分

    Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...

  2. angular关于表单指令的汇总

  3. android.animation(2) - ValueAnimator的 Interpolator 和 Evaluator

    一.插值器 插值器,也叫加速器:有关插值器的知识,我在<Animation动画详解(二)——Interpolator插值器>中专门讲过,大家可以先看看这篇文章中各个加速器的效果.这里再讲一 ...

  4. 工作流Activiti的学习总结(十二) activiti官方十分钟快速学习 (zhuan)

    http://topmanopensource.iteye.com/blog/1315341 ***************************************************** ...

  5. C Pointer-to-Function 与 C++ Pointer-to-MemberFunction 的区别

    在看APUE Figure1.10的时候发现signal(SIGINT, sig_int)这里的sig_int直接用的函数名,但是看Thinking-in-C++ Vol.2的时候发现mem_fun( ...

  6. [C++]在什么时候需要“#include string.h“

    相关资料:https://zhidao.baidu.com/question/515578726.html C++中,string头文件基本上已经包含在iostream中了.但是,平时使用的时候建议加 ...

  7. PHP——连接数据库初

    <?php //1.生成连接 造连接对象 //$db=new mysqli($dbhost(服务器),$username,$userpass,$dbdatabase); $db = new my ...

  8. hive中创建hive-json格式的表及查询

    在hive中对于json的数据格式,可以使用get_json_object或json_tuple先解析然后查询. 也可以直接在hive中创建json格式的表结构,这样就可以直接查询,实战如下(hive ...

  9. shell 后台执行脚本

    nohup command > myout.file 2>&1 &

  10. alert的美化

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...