排序从大体上来讲,做了两件事情:

1、比較两个数据项;

2、交换两个数据项。或复制当中一项

一、冒泡排序

大O表示法:交换次数和比較次数都为O(N*N)。

算法原理:

  1. 1、比較相邻的元素。假设第一个比第二个大,就交换他们两个。

  2. 2、对每一对相邻元素作相同的工作,从開始第一对到结尾的最后一对。

    在这一点。最后的元素应该会是最大的数。

  3. 3、针对全部的元素反复以上的步骤,除了最后一个。
  4. 4、持续每次对越来越少的元素反复上面的步骤,直到没有不论什么一对数字须要比較。
/**
* 冒泡排序 demo
*
*/
public void bubbleSort(){ int array [] = {22,41,22,12,93,42,23,54,77}; for (int i = 0; i < array.length-1; i++) { for (int j = 0; j < array.length-i-1; j++) { int temp = 0; if (array[j]<=array[j+1]) { }else { temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; }
}
}
}

二、选择排序

选择排序改进了冒泡排序,将必要的交换次数从O(N*N)降低到O(N)次。

不幸的是比較次数仍保持为O(N*N)。然而,选择排序仍然为大记录量的排序提出了一个很重要的改进,由于这些大量的记录须要在内存中移动,这就使交换时间和比較时间比起来。交换的时间显得更为重要。

算法原理:

对照数组中前一个元素跟后一个元素的大小,假设后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比較。前面“后一个元素”现变成了“前一个元素”。继续跟他的“后一个元素”进行比較假设后面的元素比他要小则用变量k记住它在数组中的位置(下标)。等到循环结束的时候,我们应该找到了最小的那个数的下标了。然后进行推断,假设这个元素的下标不是第一个元素的下标。就让第一个元素跟他交换一下值。这样就找到整个数组中最小的数了。然后找到数组中第二小的数。让他跟数组中第二个元素交换一下值,以此类推。

/********************************************************
*函数名称:SelectionSort
*说明: 选择排序
*********************************************************/
void SelectionSort()
{
int array [] = {3,1,2,2,1,4,7,9,2,4,10};
int out,in,min;
for(out = 0; out < array.length - 1; out++) //从第一个位置開始
{
min = out;//确保已经排出最小数据放在最左边的情况下。从最小数据右边第一个開始比較
for (in = out + 1; in < array.length; in++) { //寻找最小的数据索引 从1開始循环
if (array[in] <= array[min]) {
min = in;
}
}
int temp = array[out];
array[out] = array[min];
array[min] = temp;
System.out.print("第"+out+"次排序:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+"\t");
}
System.out.println("");
}
}

  三、插入排序

在大多数情况下,插入排序算法是主要的排序算法中效率最高的一个,尽管插入排序算法仍然须要O(N*N)的时间。可是普通情况下,它要比冒泡排序快一倍,比选择排序还要快一点。

预设:局部有序

算法原理:

将n个元素的数列分为已有序和无序两个部分。例如以下所看到的:

{{a1}。{a2。a3,a4,…,an}}

{{a1⑴。a2⑴},{a3⑴,a4⑴ …,an⑴}}

{{a1(n-1),a2(n-1) ,…},{an(n-1)}}

每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比較。找出插入位置,将该元素插入到有序数列的合适位置中。

如果在一个无序的数组中,要将该数组中的数按插入排序的方法从小到大排序。如果啊a[]={3,5,2,1,4};插入排序的思想就是比大小,满足条件交换位置。一開始会像冒泡排序一样,但会比冒泡多一步就是交换后(a[i]=a[i+1]后)原位置(a[i])会继续和前面的数比較满足条件交换,直到a[i+1]前面的数组是有序的。

比方在第二次比較后数组变成a[]={2,3,5,1,4};

/**
* 插入排序
*/
public void insertSort(){ int array [] = {3,1,2}; int in,out; for (out = 1; out < array.length; out++) { int temp = array[out];//temp作为暂时变量,存储被标记的队员 in = out; while(in>0 && array[in-1] >=temp){ array[in] = array[in-1];//队员右移一位 --in; }
array[in] = temp;//插入被标记的队员 } }

四、对象排序

compareTo方法,对象排序有点须要注意。排序原理是这种,首先依据你所选属性进行排序。假设两个属性值一样,则依照下一个属性排,假设属性还是一样。则接着下一个属性往下排,依此类推。

/**
* 对象排序
*/
public void objectSort(){ Person person1 = new Person("zhang", "san", 24); Person person2 = new Person("li", "si", 21); Person person3 = new Person("wang", "wu", 28); Person [] person = {person1,person2,person3}; int in,out; for (out = 1; out < person.length; out++) { Person temp = person[out]; in = out; while(in>0 && person[in-1].getLastName().compareTo(temp.getLastName())>0){ person[in] = person[in-1]; --in; } person[in] = temp; System.out.print("第"+out+"次排序:");
for (int i = 0; i < person.length; i++) {
System.out.print(person[i].getLastName()+"\t");
}
System.out.println(""); } }
public static void main(String[] args) {
new Sort().objectSort();
}
}
class Person{ private String lastName; private String firstName; private int age; public Person(String lastName,String firstName,int age){ this.lastName = lastName; this.firstName = firstName; this.age = age; }
public String getLastName(){ return lastName;
}
}

Java数据结构与算法之排序的更多相关文章

  1. Java数据结构和算法 - 高级排序

    希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...

  2. Java数据结构和算法 - 简单排序

    Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针 ...

  3. java数据结构和算法------希尔排序

    package iYou.neugle.sort; public class Shell_sort { public static void ShellSort(double[] array) { i ...

  4. java数据结构和算法------选择排序

    package iYou.neugle.sort; public class Select_sort { public static void SelectSort(double[] array) { ...

  5. java数据结构和算法------合并排序

      package iYou.neugle.sort; public class Merge_sort { public static void MergeSort(double[] array, i ...

  6. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

  7. Java数据结构和算法(五)--希尔排序和快速排序

    在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...

  8. Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序

    三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...

  9. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

随机推荐

  1. Hive中文注释乱码解决方案(2)

    本文来自网易云社区 作者:王潘安 执行阶段 launchTask    回到Driver类的runInternal方法,看以下执行过程.在runInternal方法中,执行过程调用了execute方法 ...

  2. unittest单元测试(测试报告生成)

    自动化测试执行完成之后,我们需要生成测试报告来查看测试结果,使用HTMLTestRunner模块可以直接生产Html格式的报告. 下载地址: http://tungwaiyip.info/softwa ...

  3. Mac版有道云笔记不能自动同步

    删除本地资源文件夹 /Users/xxxx/Library/Containers/com.youdao.note.YoudaoNoteMac 直接删除整个文件夹,之后重新登录账号.

  4. NYOJ 469 擅长排列的小明 II

    擅长排列的小明 II 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1, ...

  5. python类可以截获Python运算符

    类可以截获Python运算符 现在,让我们来看类和模块的第三个主要差别: 运算符重载.简而言之,运算符重载就是让用类写成的对象,可截获并响应用在内置类型上的运算:加法.切片.打印和点号运算等.这只是自 ...

  6. BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster ——广义后缀自动机

    给定n个串m个询问,问每个串在n个串多少个串中出现了. 构建广义后缀自动机,(就是把所有字符串的后缀自动机合并起来)其实只需要add的时候注意一下就可以了. 然后对于每一个串,跑一边匹配,到达了now ...

  7. 【THUSC2016】成绩单(bzoj4897)

    $f(i,j,x,y)$ 表示区间 $[i,j]$中,第 $j$ 个数在最后一次操作中才消去,最后一次操作的最大值为 $x$,最小值为 $y$ 时的最小代价: $g(i,j)$ 表示区间 $[i,j] ...

  8. gcc/g++ 编译时出现:“对’xxxx’未定义的引用,collect2: error: ld returned 1 exit status” 的错误

    出现的问题: 在使用 make 编译实现一个程序时,出现了下面的错误.查看程序源文件所在的目录时发现程序已经完成了编译,并生成了 list_repo.o 的文件,说明是在程序链接生成可执行文件时发生了 ...

  9. android系统编译打开系统蓝牙

    在项目配置文件ProjectConfig.mk中开启蓝牙以后,但是设置菜单中并没有出现蓝牙选项,最后发现是因为ProjectConfig.mk同级目录下没有蓝牙配置文件android.hardware ...

  10. Chapter 4-5

    1.切片对象  sequence[起始索引:结束索引:步进值] 对象身份的比较 is /is not 2.eval()参数是一个字符串, 可以把这个字符串当成表达式来求值. >>>x ...