《Java数据结构与算法》笔记-CH3简单排序
class ArrayBub {
private long[] arr;
private int nElement;
public ArrayBub(int size) {
arr = new long[size];
nElement = 0;
}
@Override
public String toString() {
if (nElement == 0)
return "[]";
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < nElement; i++) {
sb.append(arr[i] + ",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
return sb.toString();
}
public void display() {
System.out.println(toString());
}
public void insert(long value) {
if (nElement == arr.length) {
System.out.println("数组已满,插入终止");
return;
}
arr[nElement] = value;
nElement++;
}
/**
* 冒泡排序 思想:将小得数据项放在数组的最开始(下标为0);并将最大的数据项放在最后(下标为nElement-1).
*
* 外层for循环i从数组的最后开始,即i等于nElement-1,每经过一次循环减一。下标大于i的数据项都已经排好序。
* 变量i在每完成一次内部循环后就左移一位,因此不在处理那些已经排好序的数据了。
*
* 内层for循环计数器j从数组最开始起,即j=0,每完成一次内部循环加一,当等于i的时候结束一次循环。
* 在内层循环体中,下标为j和j+1的两个元素进行比较,如果前面的大就交换。
*
* 冒泡中的不变性:外层循环i右边的所有元素都有序,在整个运行过程中这个条件始终为真。 (第一趟开始前,因为i右边没有元素,所以起始时为真)
* 效率:交换和比较操作的复杂度都是O(n^2)
*/
public void bubbleSort() {
for (int i = nElement - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swap(j, j + 1);
System.out.print("发生了交换:");
display();
}
}
System.out.print("第" + (nElement - i + 1) + "遍排序结果:");
display();
}
}
/**
* 选择排序:改进了冒泡排序,交换次数从O(n^2)减少到O(n),但是比较次数仍是O(n^2)。然而也是很大的一个改进。
* 因为这些大量的记录需要在内存中移动,
* 这就使得交换的时间和比较的时间相比起来,交换的时间更为重要。(在Java语言中不是这种情况,Java只是改变了引用位置,实际对象的位置并没有改变)
* 。 思想:从数组最左边第一个开始,遍历一遍找到最小的元素,将其和第一个位置的元素交换位置;
* 第二遍从最左边第二个开始,便利一遍找到最小的,和第二个位置元素交换 。。。遍历完 每一轮比较O(n)次,交换一次.
* 不变性:下表小于或等于外层循环变量的数据项总是有序的。
* 效率:和冒泡比起来更快,因为进行的交换次数少。当数据项较少时,特别是如果交换的时间级比比较的时间级大得多时,选择排序实际上相当快。
*/
public void selectSort() {
int minFlag;
for (int i = 0; i < nElement; i++) {
minFlag = i;
for (int j = i; j < nElement; j++) {
if (arr[j] < arr[minFlag]) {
minFlag = j;
}
}
swap(minFlag, i);
System.out.print("第" + (i + 1) + "遍排列");
display();
}
}
/**
* 插入排序:在外层for循环中,out变量从1开始,向右移动,标记了未排序不分的最左端的数据。
* 在内层while循环中,in变量从out开始,向左移动,直到temp变量小于in所指的元素,
* 或者已经不能再往左移动为止。while循环的每一趟都向右移动了一个已排序的数据项。
*
* 不变性:每趟结束时,在将temp位置的项插入后,比out变量下标号小的元素都是局部有序的。
* 效率:第一趟排序最多比较一次,第二趟最多2次。。。最后一趟比较N-1次。复制的次数大致等于
* 比较的次数,然而一次复制和一次交换的时间耗费不同,所以相对于随机数据,插入比冒泡快一倍
* 比选择排序略快。对于随机顺序数据进行插入排序也需要O(n^2)的时间级。
* 应用:对于有序或者基本有序的数据来说,插入排序要好得多。当数据有序的时候,while循环
* 的条件总为假,所以变成了外层循环中的一个简单语句,执行N-1次。这种情况下,算法
* 运行只需要O(n)的复杂度。///////然而对于逆序排列的数据,每次比较和移动都会执行,所以
* 插入排序不比冒泡排序快。
*/
public void insertSort() {
for (int out = 1; out < nElement; out++) {
long temp = arr[out];
int in = out;
while (in > 0 && arr[in - 1] >= temp) {
arr[in] = arr[in - 1];
in--;
}
arr[in] = temp;
System.out.println("第"+out+"遍排序"+toString());
}
}
/**
* 交换元素
*
* @param first
* @param second
*/
private void swap(int first, int second) {
long temp = arr[first];
arr[first] = arr[second];
arr[second] = temp;
}
}
public class BubSortDemo {
public static void main(String[] args) {
long[] a = { 12, 33, 2, 45, 43, 1, 9 };
ArrayBub ab = new ArrayBub(6);
for (int i = 0; i < a.length; i++) {
ab.insert(a[i]);
ab.display();
}
// ab.bubbleSort();
// ab.selectSort();
ab.insertSort();
ab.display();
}
}
《Java数据结构与算法》笔记-CH3简单排序的更多相关文章
- 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现
内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...
- Java数据结构和算法 - 简单排序
Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针 ...
- Java数据结构和算法(九)——高级排序
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...
- Java数据结构和算法 - 高级排序
希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序
三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- Java数据结构和算法 - 堆
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...
随机推荐
- iOS处理XMl提供GDataXMLNode下载的链接
GDataXMLNode .好东西,处理xml 在iOS 中使用.可以编辑和读取Xml文档.支持Xpath.这个很好. GDataXMLNode.h GDataXMLNode.m 文件很不好找啊. / ...
- jquery获取div距离顶部的距离
获取元素到页面顶部距离的语句为: 1.jquery写法:$(“#divID”).offset().top //推荐 $("#vertical").position().top 2. ...
- Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na me: com/ray/net/UDP_Receive)
一.事件经过 今晚学习java网络编程,在eclipse中写了两个个java文件,一个发送端UDP_Send2.java,一个接收端UDP_Receive.java.实现发送端键盘录入信息,通过UDP ...
- Woobuntu woobuntu_build.sh hacking
# Woobuntu woobuntu_build.sh hacking # 说明: # 有时候因为一些需求,我们需要定制一些系统,包括Ubuntu系统,于是 # 我们自然需要知道如何去解包一个Ubu ...
- HDU 5312 Sequence (规律题)
题意: 一个序列的第n项为3*n*(n-1)+1,而 n>=1,现在给一个正整数m,问其最少由多少个序列中的数组成? 思路: 首先,序列第1项是1,所以任何数都能构成了.但是最少应该是多少?对式 ...
- Java [Leetcode 118]Pascal's Triangle
题目描述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...
- 开源的rtsp实现
开源的rtsp实现 ============== -- by BeagleTam ...
- mysql中出现的Data truncated for column
mysql中想一个数据库中插入一条记录时,有可能因为好多原因,会出现Data truncated for column XXXXX的错误,这是因为你的数据类型的长度不一致导致的,仔细查看一下数据类型的 ...
- 应用市场高速下载以及网页端调起APP页面研究与实现
Github博文地址,此处更新可能不是很及时. 好久没写博客了,好大一个坑.正好,最近刚做完应用市场的高速下载功能,便拿来填了这个坑. 话说产品为了增加用户量,提升用户活跃度以及配合推广,更坑爹的是看 ...
- POJ 1173 Find them, Catch them
题意:有两个帮派,每个人只属于一个帮派,m次操作,一种操作告诉你两个人不是一个帮派的,另一种操作问两个人是不是在一个帮派. 解法:并查集+向量偏移.偏移量表示和根节点是不是同一帮派,是为0,不是为1. ...