Java排序算法(一)

排序的基本概念和分类

1.1排序的定义  

  在《大话数据结构》中,排序定义为,假设含有n个记录的序列为{r1,r2,...,rn},其相应的关键字{k1,k2,...,kn},需确定1,2...n的一种排列p1,p2...pn,是其相应的关键字满足Kp1<=Kp2<=...<=Kpn(非递减或非递增)关键,即使得序列称为一个按关键字有序的序列{rp1,rp2...rp3},这样的操作称为排序。

1.2排序的稳定性

  假设ki=kj(1<=i<=n,1<=j<=n,i!=j),且在排序前的序列中ri领先于rj(即i<j)。如果排序后ri仍然领先rj,则所用的排序方法是稳定的;反之, 若可能使得排序后序列中rj领先ri,则称所用的排序方法是不稳定的。如图所示:

1.3内排序和外排序

内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中。
外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要内外多次交换数据才能进行
主要讨论内排序,排序算法性能主要受三方面影响
1.时间性能(尽可能少的关键字比较次数和尽可能少的记录移动次数)
2.辅助空间(执行算法所需要的其他存储空间)
3.算法复杂性(算法本身的复杂度,不是算法的时间复杂度) 

1.4七个主要的排序算法

按照算法的复杂性(可以简单理解为算法逻辑和算法编码量)
简单排序算法:冒泡排序,简单选择排序,直接插入排序
改进算法:快速排序,希尔排序,归并排序,堆排序

一、简单排序算法

 public class Sort
{
//实现从小到大排序
public static void main(String[] args)
{
int[] arr1 = {9,1,5,8,3,7,4,6,2};
//bubbleSort2(arr1);
//selectSort(arr1);
insertSort(arr1);
for(int i=0;i<arr1.length;i++)
{
System.out.println(arr1[i]);
}
}
/*
*冒泡排序,相邻两个元素进行比较,如果满足条件进行位置置换
*原理:本函数内循环一次,将最值提到冒泡到最尾部
*备注:各位大雕可以写一个冒泡到数组头部的,我写冒泡到尾部代码看起来比较好记,哈哈
*时间复杂度:比较1+2+3+...+n=n*(n+1)/2次,并做等数量级的记录移动O(n*n)
*/
public static void bubbleSort1(int[] arr)
{ for(int i=0;i<arr.length-1;i++)
{
for(int j=0;j<arr.length-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
/*
*简单选择排序,以一个角标的元素和其他元素进行比较
*原理,从n-1-i个记录中选出关键字最小的记录,并和第i个记录交换
*时间复杂度:O(n*n),相对而言,简单选择排序的性能要略优于冒泡排序
*/
public static void selectSort(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
int min = i; //将当前下标定义为最小值下标
for(int j=i+1;j<arr.length;j++)
{
//j初始化为i,表示每次都是数组arr下标为i的元素和后面(i+1)的元素进行比较
if(arr[min]>arr[j])
{
min = j; //如果有小于当前最小值的关键字,此关键字下标赋值给min
}
}
if(i!=min) //如果min不等于i,说明找到最小值,交换
{
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}
/*
*直接插入排序,
*原理:将一个记录插入到已经排好序的有序表中,从而得到一个新的。记录数增加1的有序表
*例子:《大话数据结构》中将其比作抽扑克牌,抽一张排序一张,好书推荐。。。
*排序复杂度:O(n*n),直接插入排序比冒泡和简单选择排序的性能要好一些。
*/
public static void insertSort(int[] arr)
{
int temp = 0;
int j = 0;
for(int i=1;i<arr.length;i++)
{
temp = arr[i];
for(j=i;j>0&&temp<arr[j-1];j--)
{
arr[j] = arr[j-1]; //使得记录后移
}
arr[j] = temp; //插入到正确位置
}
}
}

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. 面向对象要点(this关键字)

    package day07; public class ThisKeywords { private String name; private void Foo(String name) { this ...

  2. 超牛 猴子补丁,修改python内置的print

    猴子补丁一般是用于修改三方包或官方包,也可以用来修改自己或者他人的代码. 但也可以用来修改python 语言内置的关键字. 本篇博客修改python最常用的内置print,使你使用print时候,自动 ...

  3. numpy和matlab计算协方差矩阵的不同(matlab是标准的,numpy相当于转置后计算)

    matlab是标准的,numpy相当于转置后计算 >> x = [2,0,-1.4;2.2,0.2,-1.5;2.4,0.1,-1;1.9,0,-1.2] x = 2.0000    0 ...

  4. C笔试题(二)

    /* 现在有一个数组 我们可以定义数组的子数组 如 数组 1 3 4 2 5 8 7 它的子数组可以是 1 3 4 3 4 2 5 等等 请写一个算法 找一个子数组 这个子数组递增不减少 并且是满足递 ...

  5. 07_ddms透视图介绍

    通过ADB(Android Debug Bridge)安卓调试桥把你的Eclipse(集成开发环境)和你的设备连接在一起.有时候ADB可能会被其他的东西占用.例如WPS会跟你抢ADB(抢端口).如果你 ...

  6. 安装yum在ubnutu上

    安装yum在ubnutu上1:首先检测是否安装了build-essential程序包 apt-get install build-essential2.安装yumapt-get install yum ...

  7. Hive Joins 用法与操作

    Hive表连接的语法支持如下: join_table: table_reference JOIN table_factor [join_condition] | table_reference {LE ...

  8. R语言中的字符处理

    R语言中的字符处理 (2011-07-10 22:29:48) 转载▼ 标签: r语言 字符处理 字符串 连接 分割 分类: R R的字符串处理能力还是很强大的,具体有base包的几个函数和strin ...

  9. R: which(查询位置)、%in% (是否存在)、ifelse(判断是否):

    ################################################### 问题:ifelse.which.%in%    18.4.27 解决方案: > x < ...

  10. win7 系统安装 docker

    如果顺利的话,步骤如下: 1.下载DockerToolbox 2.安装DockerToolbox,默认配置,一路下一步即可完成安装 3.安装成功后,桌面会新增三个快捷方式,如下图 4.点击运行Dock ...