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. mount总结

    挂载分区 mount基本语法 mount [参数] /dev/sdb1(需要挂载的分区) /sdb1(挂载目录) 参数是可选的,也可以不带参数,参数的使用方法(-o ro,sync,atime). 参 ...

  2. Zend Server 安装与配置图文教程

    Zend Server是一款专业的PHP Web开发应用服务器,一些初次接触并使用此程序的朋友可能不太了解安装方法,本文为您提供了Zend Server 安装与配置图文教程,欢迎大家阅读,并提出自己的 ...

  3. File 类 操作实例

    File 操作 <介绍> 尽管java.io定义的大多数类是实行流式操作的,File类不是.它直接处理文件和文件系统.也就是说,File类没有指定信息怎样从文件读取或向文件存储:它描述了文 ...

  4. Shape和 layer-list

    shape 基本使用 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android= ...

  5. 16_点击事件第三种写法_activity实现接口

    第一种写法是有名内部类,第二种写法是匿名内部类,第三种写法是MainActivity实现接口OnClickListener.直接让MainActivity实现了OnClickListener这个接口. ...

  6. SM4算法的c++实现

    百度到的论文已给出算法. flag为1为解密,flag为0是加密. #include<bits/stdc++.h> using namespace std; typedef long lo ...

  7. 阶段2-新手上路\项目-移动物体监控系统\Sprint3-移动监控主系统设计与开发

    移动图像监控系统 去找一些相关开源程序进行移植:百度搜索-linux 移动监控 motion是一套免费开源的移动图像监测程序 前面我们已经使用了很多开源软件,他们的使用方法都是大同小异的 1).先在当 ...

  8. The project was not built since its build path is incomplete. Cannot find the class file for java.lang.Object

    The project was not built since its build path is incomplete. Cannot find the class file for java.la ...

  9. hdu1062

    #include<stdio.h> #include<string.h> int main() { int i,n,len,j,k,t; char s1]; scanf(&qu ...

  10. python接口自动化(三十五)-封装与调用--流程类接口关联(详解)

    简介 流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便.在这里我们还是以博客园为例,带着小伙伴们实践一下. 接口封 ...