1.冒泡排序

  比较相邻元素,如果第一个比第二个大,就交换位置,每一次交换,当前

package BubbleSort;

public class Test
{
public static void main(String[] args)
{
int[] arr = {1,3,5,7,3,6,7,4,8,34,6};
Test test = new Test();
test.bubbleSort(arr);
for(int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
} public void bubbleSort(int[] num)
{
int temp = 0;
for(int i = 0; i < num.length - 1; i++)
{
for(int j = i + 1; j < num.length; j++)
{
if(num[j-1] > num[j])
{
temp = num[j];
num[j] = num[j - 1];
num[j - 1] = temp;
}
}
}
} }

  

2. 选择排序

  从所有的数字中找到最小的数,放在第一个位置,然后从剩余的数字中找出次小的数,放在第二个位置,然后从剩下的数字中找出再次小的数,放在第三个位置......以此类推,直到所有的数据全部有序。

package SelectionSort;

public class Test
{
public static void main(String[] args)
{
int[] a = {4,2,1,6,3,6,0,-5,4,3};
Test test = new Test();
test.selectionSort(a);
for(int i = 0; i < a.length; i++)
{
System.out.print(a[i] + " ");
}
} public void selectionSort(int[] source)
{
for(int i = 0; i < source.length; i++)
{
for(int j = i + 1; j < source.length; j++)
{
if(source[i] > source[j])
{
swap(source, i, j);
}
}
}
} private void swap(int[] source, int x, int y)
{
int temp = source[x];
source[x] = source[y];
source[y] = temp;
}
}

  注意将选择排序和冒泡排序进行区分:冒泡排序是将相邻的数据进行对比,而选择排序是将下标为i和j的数据进行对比(每次选出当前数据集中最小的)。

3.插入排序

  ①从第一个元素开始,该元素可以认为已经排序;

  ②取出下一个元素,在已经排序的元素序列中从后往前进行扫描;

  ③如果该元素(已排序)大于新元素,则将该元素移动到下一个位置;

  ④重复步骤③,直到找到已排序的元素小于或者等于新元素的位置;

  ⑤将该元素插入到新位置中;

  ⑥重复步骤②。

package InsertionSort;

public class Test
{
public static void main(String[] args)
{
int[] a = {4,5,3,2,6,5,6,43};
Test test = new Test();
test.selectSort(a);
for(int i = 0; i < a.length; i++)
{
System.out.println(a[i]);
}
} public void selectSort(int[] source)
{
for(int i = 1; i < source.length; i++)
{
for(int j = i; j > 0 && source[j] < source[j - 1]; j--)
{
swap(source, j, j - 1);
}
}
} public void swap(int[] source, int x, int y)
{
int temp = source[x];
source[x] = source[y];
source[y] = temp;
} }

空间复杂度:O(1)

时间复杂度:最优O(n),此时数组已经是升序排列,只需要完后n-1次比较即可;

      最坏O(n*n),此时数组已经是降序排列,此时需要进行n(n-1)/2次比较,赋值操作的比较次数是n(n-1)/2+(n-1)次。

平均时间复杂度:O(n*n)。

4.二分排序

  二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。

5.快速排序

  

package QuickSort;

public class Test
{
public static void main(String[] args)
{
int[] num = {3,4,5,32,3,5,2,78};
Test test = new Test();
test.quickSort(num, 0, num.length - 1);
for(int i = 0; i < num.length; i++)
{
System.out.println(num[i]);
}
} public void quickSort(int[] a, int low, int high)
{
int start = low;
int end = high;
int key = a[low]; while(end > start)
{
//从后往前比较
//如果没有比关键字小,比较下一个,直到有比关键字小的交换位置,然后有从前往后比较
while(end > start && a[end] >= key)
{
end--;
}
if(a[end] <= key)
{
int temp = a[end];
a[end] = a[start];
a[start] = temp;
}
//从前往后比较
//如果没有比较关键字大的,比较下一个,直到有比关键字大的交换位置
while(end > start && a[start] <= key)
{
start++;
}
if(a[start] >= key)
{
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
//此时第一次循环比较结束,关键字的位置已经确定了,左边的值都比关键字小,右边的值都比关键字大,但是两边的顺序可能不一样,进行
//递归运算
}
if(start > low)
quickSort(a, low, start - 1);//左边序列,第一个索引位置到关键字索引-1
if(end < high)
quickSort(a, end + 1, high);//右边序列,从关键字索引+1到最后一个
}
}

  

java — 排序算法的更多相关文章

  1. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

  2. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  3. java排序算法(一):概述

    java排序算法(一)概述 排序是程序开发中一种非常常见的操作,对一组任意的数据元素(活记录)经过排序操作后,就可以把它们变成一组按关键字排序的一组有序序列 对一个排序的算法来说,一般从下面三个方面来 ...

  4. java排序算法(十):桶式排序

    java排序算法(十):桶式排序 桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序 ...

  5. java排序算法(九):归并排序

    java排序算法(九):归并排序

  6. java排序算法(八):希尔排序(shell排序)

    java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的 ...

  7. java排序算法(七):折半插入排序

    java排序算法(七):折半插入排序 折半插入排序法又称为二分插入排序法,是直接插入排序法的改良版本,也需要执行i-1趟插入.不同之处在于第i趟插入.先找出第i+1个元素应该插入的位置.假设前i个数据 ...

  8. java排序算法(六):直接插入排序

    java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1 ...

  9. java排序算法(五):快速排序

    java排序算法(五):快速排序 快速排序是一个速度非常快的交换排序算法,它的基本思路很简单,从待排的数据序列中任取一个数据(如第一个数据)作为分界值,所有比它小的元素放到左边.所有比它大的元素放到右 ...

  10. java排序算法(四):冒泡排序

    java排序算法(四):冒泡排序 冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序.快速排序o(nlogn,底数为2).但是有两个优点 1.编程复杂度很低.很容易写出代码 ...

随机推荐

  1. Android中,子线程使用主线程中的组件出现问题的解决方法

    Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行 ...

  2. flask第三方插件WTForms

    在django中有ModelForm, 虽然flask原生没有提供, 但是强大的第三方也提供了这样的功能 虽然不如django的强大, 但是基本的功能还是可以有的, 下面就来使用一哈. WTForms ...

  3. php源码建博客2--实现单入口MVC结构

    主要: MVC目录结构 数据库工具类制作 创建公共模型类和公共控制器类 --------------文件结构:-------------------------------------- blog├─ ...

  4. Java开发小技巧(五):HttpClient工具类

    前言 大多数Java应用程序都会通过HTTP协议来调用接口访问各种网络资源,JDK也提供了相应的HTTP工具包,但是使用起来不够方便灵活,所以我们可以利用Apache的HttpClient来封装一个具 ...

  5. Apache Flume简介及安装部署

    概述 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的软件. Flume 的核心是把数据从数据源(source)收集过来,再将收集到的数据送到指定的目 ...

  6. python 基础练习题, 陆续添加中

    判定用户输入数字是否为闰年 闰年的定义:能够被4整除的年份 #input是自定义输入内容的函数 year = input("请输入年份数字:") #xxx.isdigit方法是检测 ...

  7. ruby中的字符串分隔符--split

    当字符串是以“:”隔开时,可以这样写: column = str.split(/:/) 这样,column就是字符串每栏的值所构成的数组. eg: str = "Ruby in a shel ...

  8. MySQL高级第五章——主从复制

    一.复制的基本原理 slave会从master读取binlog(二进制日志文件)进行数据同步 步骤: 详细操作步骤请参见:http://www.cnblogs.com/luckcs/articles/ ...

  9. python中通过datetime获取UTC时间ISO格式

    一个热点统计需求,需要限定一个时间范围,计算出该范围内的热点事件,相关数据则以UTC标准时间的ISO时间格式存在mongodb中,和服务器设置的时区UTC+8并不一致. 为了解决这个问题,直觉反应是在 ...

  10. 佛山Uber优步司机奖励政策(7月27日-8月2日)

    周上线时间少于等于7个小时,以下奖励条件无效,仅返还车资.   滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最新最详细注册流程)/月入2万/ ...