Java基本排序
长度为N的数组升序排序
一,冒泡排序
public class BubbleSort {
private double[] data;
public BubbleSort(double[] data) {
this.data = data;
}
public void sort(){
for(int p = data.length - 1 ; p > 0 ; p--){
for(int i = 0 ; i < p ; i++){
if(data[i] > data[i+1] ){
double tmp = data[i];
data[i] = data[i+1];
data[i+1] = tmp;
}
}
}
}
public void display(){
for(int i = 0 ; i < data.length ; i++){
System.out.print(data[i]+" ");
}
System.out.print("\n");
}
public static void main(String[] args) {
double[] data = {Math.random(),Math.random(),Math.random(),Math.random()};
BubbleSort bubbleSort = new BubbleSort(data);
bubbleSort.display();
bubbleSort.sort();
bubbleSort.display();
}
}
0.4125010895286405 0.1682061731460387 0.5946448214944792 0.2760597727054087
0.1682061731460387 0.2760597727054087 0.4125010895286405 0.5946448214944792
比较次数:第一次比较N-1次,第二次比较N-2次,总比较次数为(N-1) + (N-2) +...+ 1 = (N-1)*N/2
交换次数:如果数组本身为降序排序,则需交换(N-1)*N/2次,如果数组本身为升序排序,则需交换0次,如果数据是随机的,大约需要交换(N-1)*N/4次
时间复杂度:(N-1)*N/2 + (N-1)*N/4,总得来说为O(N*N)
二,选择排序
public class SelectSort {
private double[] data;
public SelectSort(double[] data){
this.data = data;
}
public void sort(){
for(int i = 0 ; i < data.length ; i++){
int flag = i;
for(int j = i + 1 ; j < data.length ; j++){
if( data[j] < data[flag]){
flag = j;
}
}
double tmp = data[i];
data[i] = data[flag];
data[flag] = tmp;
}
}
public void display(){
for(int i = 0 ; i < data.length ; i++){
System.out.print(data[i]+" ");
}
System.out.print("\n");
}
public static void main(String[] args) {
double[] data = {Math.random(),Math.random(),Math.random(),Math.random()};
SelectSort selectSort = new SelectSort(data);
selectSort.display();
selectSort.sort();
selectSort.display();
}
}
0.8992760265680794 0.36366208723355853 0.5105026583966352 0.27067878126430966
0.27067878126430966 0.36366208723355853 0.5105026583966352 0.8992760265680794
比较次数:第一次比较N-1次,第二次比较N-2次,总比较次数为(N-1) + (N-2) +...+ 1 = (N-1)*N/2
交换次数:如果数组本身为降序排序,则需交换N次,如果数组本身为升序排序,则需交换0次,如果数据是随机的,大约需要交换N/2次
时间复杂度:(N-1)*N/2 + N/2,总得来说为O(N*N),但是会比冒泡排序快
三,插入排序
public class InsertSort {
private double[] data;
public InsertSort(double[] data) {
this.data = data;
}
public void sort(){
for(int i = 1 ; i < data.length ; i++){
double tmp = data[i];
int insertPoint = i;
while(insertPoint > 0 && data[insertPoint-1] > tmp){
data[insertPoint] = data[insertPoint-1];
--insertPoint;
}
if(insertPoint < i){
data[insertPoint] = tmp;
}
}
}
public void display(){
for(int i = 0 ; i < data.length ; i++){
System.out.print(data[i]+" ");
}
System.out.print("\n");
}
public static void main(String[] args) {
double[] data = {Math.random(),Math.random(),Math.random(),Math.random()};
InsertSort insertSort = new InsertSort(data);
insertSort.display();
insertSort.sort();
insertSort.display();
}
}
0.25855304984386873 0.5035006863323077 0.8986028814892651 0.724194607320699
0.25855304984386873 0.5035006863323077 0.724194607320699 0.8986028814892651
比较次数:第一次比较1次,第二次比较2次,总比较次数为1+2+...+(N-1)= (N-1)*N/2,每一趟排序发现插入点之前,平均只有一半的数据进行了比较,所以总的比较次数为:(N-1)*N/4
交换次数:交换次数小于比较次数,并且插入排序的交换比冒泡排序和选择排序要快
时间复杂度:(N-1)*N/4 + (N-1)*N/4,总得来说为O(N*N),但是会比选择排序快
如果数组是基本有序的,即每个数据项只需移动1次或不需要移动,那么插入排序的时间复杂度将变为O(N),这无疑是非常快的
四,表排序:
主要是利用了有序链表的特性,将数组中的所有数据插入到有序链表中,它们将自动按顺序排列,然后再顺次取出链表中的所有数据,把它们放到数组中,数组便排好序了
public class SortedList {
private class Data{
private double d;
private Data next = null;
Data(double d){
this.d = d;
}
}
private Data first = null;
public void insert(double d){
Data data = new Data(d);
Data pre = null;
Data cur = first;
while(cur != null && (data.d > cur.d)){
pre = cur;
cur = cur.next;
}
if(pre == null)
first = data;
else
pre.next = data;
data.next = cur;
}
public double deleteFirst() throws Exception{
if(first == null)
throw new Exception("empty!");
Data temp = first;
first = first.next;
return temp.d;
}
}
public class ListSort {
private double[] data;
private SortedList sl;
public ListSort(double[] data){
this.data = data;
sl = new SortedList();
}
public void sort() throws Exception{
for(int i = 0 ; i< data.length ; i++){
sl.insert(data[i]);
}
for(int i = 0 ; i< data.length ; i++){
data[i] = sl.deleteFirst();
}
}
public void display(){
for(int i = 0 ; i < data.length ; i++){
System.out.print(data[i]+" ");
}
System.out.print("\n");
}
public static void main(String[] args) throws Exception{
double[] data = {Math.random(),Math.random(),Math.random(),Math.random()};
ListSort ls = new ListSort(data);
ls.display();
ls.sort();
ls.display();
}
}
0.6379262500544237 0.18329827548195576 0.8408253367598466 0.6213596557610592
0.18329827548195576 0.6213596557610592 0.6379262500544237 0.8408253367598466
比较次数:将数据插入链表平均需要比较N/2次
交换次数:将数组数据放入链表,再将链表数据放回数组,总共需移动2N次
时间复杂度:N/2 + 2N,总得来说为O(N)
虽然排序速度比上面3种排序方式要快,但是需要大约2倍的内存空间,数组和链表同时存在于内存中
Java基本排序的更多相关文章
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- java 集合排序(转)
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
- java:高速排序算法与冒泡排序算法
Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /** * * @Description: * @author:cuiyaon ...
- java常见排序方法
1.java常用排序方法 1) 选择排序 原理:a. 将数组中的每个元素,与第一个元素比较 如果这个元素小于第一个元素, 就将这个 两个元素交换. ...
- java希尔排序
java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...
- Java八大排序算法
Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...
- Java常用排序算法及性能测试集合
测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...
- java 集合排序
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
- Java各种排序算法
Java各种排序算法详解 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有 ...
随机推荐
- Poj 1953 World Cup Noise之解题报告
World Cup Noise Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16369 Accepted: 8095 ...
- 【原】Redis分区
Redis高级篇 分区 为什么分区? Redis中的分区主要有两个目的: 允许用多台机器的内存存放更大的数据集.如果没有分区,那么你只能存放单台机器内存的最大值的数据集. 允许用多核和多台机器提高计算 ...
- NOIP2006 作业调度方案
1. 作业调度方案 (jsp.pas/c/cpp) [问题描述] 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工 ...
- HDU2015校赛 The Country List
今天手感真差..各种读错题意.水题... 就是说,给你几个串.如果长度一样并且相同位置字符相同(不分大小写)的个数大于两个就是不同串. #include<iostream> #includ ...
- Magento 多语言
一: 1>进入后台选择如下: 2> 显示页面如下: 输入后台登陆的用户名和密码. 3>然后去Magento官网搜索一下 Magento Official Chinese Transl ...
- asp.net 分析器错误消息: 文件.aspx.cs”不存在错误
发布webapplication时后老是报告分析器错误消息: 文件.aspx.cs”不存在错误,差点抓狂,后来在网上搜到原因是: <%@ Page Language="C#" ...
- ubuntu 13.04下sublime text 3使用中文输入法
主要思路参考 http://blog.yanwen.org/archives/1955.html libsublime-imfix.so 这个库自己编译和从他这下载的 md5一样.可以不用编译了.直接 ...
- POJ3666-Making the Grade(左偏树 or DP)
左偏树 炒鸡棒的论文<左偏树的特点及其应用> 虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱…… 虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大 ...
- poj1743--Musical Theme(后缀数组)
题意:求一列数字中走向相同的两个字序列,长度要求大于5 题解:相邻数字求差,原题就变成求相同的长度大于4的子串. [存疑:在保证两个子串不相交时觉得限定条件应该是大于x,但是wa了= = 不是很理解] ...
- MySQL Workbench 导出数据库脚本(图文)
1.如下图红框所示,在Server Administration那里,点击"New Server Instance" 2.如下图所示,如果是连接本地数据库,则选localhost, ...