java讲讲几种常见的排序算法
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讲讲几种常见的排序算法的更多相关文章
- java讲讲几种常见的排序算法(二)
java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...
- Java实现7种常见的排序算法
数据结构中的内部排序:不需要访问外存便能完成,是一个逐步扩大记录的有序序列长度的过程. 可以分为5类: 1.插入排序:直接插入排序,稳定排序,时间复杂度为O(n^2)非递减有序,设置r[0]为哨兵进行 ...
- 用Java实现几种常见的排序算法
用Java语言实现的各种排序,包括插入排序.冒泡排序.选择排序.Shell排序.快速排序.归并排序.堆排序.SortUtil等. 插入排序: package org.rut.util.algorith ...
- java几种常见的排序算法总结
/*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int ...
- 七种常见经典排序算法总结(C++实现)
排序算法是非常常见也非常基础的算法,以至于大部分情况下它们都被集成到了语言的辅助库中.排序算法虽然已经可以很方便的使用,但是理解排序算法可以帮助我们找到解题的方向. 1. 冒泡排序 (Bubble S ...
- python3实现几种常见的排序算法
python3实现几种常见的排序算法 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...
- Java中8种常见的排序方法
排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...
- Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构
转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5492298.html 在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习 ...
- 用php实现四种常见的排序算法
几种常见的排序 排序是一个程序员的基本功,对于初级phper,更是可以通过排序算法来锻炼自己的思维能力. 所谓排序,就是对一组数据,按照某个顺序排列的过程.下面就总结四种常用的php排序算法,分别是冒 ...
随机推荐
- atitit.orm的缺点与orm框架市场占有率,选型attilax总结
atitit.orm的缺点与orm框架市场占有率,选型attilax总结 1. attilax的orm框架要求 1 2. orm框架市场占有率 2 3. spring jdbc templt 3 4. ...
- 0073 javacTask: 源发行版 1.8 需要目标发行版 1.8
今天在编译执行下面这段代码的时候,编译报错:javacTask: 源发行版 1.8 需要目标发行版 1.8 public class Test { public static void main(St ...
- cloudera-manager-installer.bin不生成repo文件
[转] 运行cloudera-manager-installer.bin,并在后边增加参数使其不再在/etc/yum.repo.d/下生成cloudera-manager.repo文件 ./cloud ...
- (转)Sql Server之旅——第八站 复合索引和include索引到底有多大区别?
索引和锁,这两个主题对我们开发工程师来说,非常的重要...只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的 索引都是单列索引...当然数据库不可能只认单列索引,还有我这篇 ...
- 记一次线上MySQL数据库死锁问题
最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过.这次刚好遇到了,便在此记录一下 ...
- C语言 · 三角形面积
算法提高 三角形面积 时间限制:1.0s 内存限制:256.0MB 问题描述 由三角形的三边长,求其面积. 提示:由三角形的三边a,b,c求面积可以用如下的公式: s=(a+b+c ...
- Javascript知识点:IIFE - 立即调用函数
Immediately-invoked Function Expression(IIFE,立即调用函数),简单的理解就是定义完成函数之后立即执行.因此有时候也会被称为“自执行的匿名函数”(self-e ...
- sort-uniq-cut-join命令练习
[root@linux Desktop]# cat> fruits.txt banana orange persimmon %%banana apple ORAGE cat> fruits ...
- Mybatis批量更新<转>
Mybatis批量更新 批量操作就不进行赘述了.减少服务器与数据库之间的交互.网上有很多关于批量插入还有批量删除的帖子.但是批量更新却没有详细的解决方案. 实现目标 这里主要讲的是1张table中.根 ...
- Lua中的table函数库
table.concat(table, sep, start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组 ...