冒泡,选择,插入三大基本排序解析以及Demo
2016-08-20 23:28
453 查看
面试中被问道每写好,回来写几个Demo加深一下认识
冒泡是一种流行但效率低的算法,具体通过反复交换相邻未排序的元素
算法实现通过经典java 演示进行阐述
//冒泡是一种流行但效率低的算法,反复交换相邻未排序的元素
public class BubbleDemo {
// int[] a = { 1, 5, 2, 4, 3, 7, 0 };
int[] a = { 6, 5, 4, 3, 2, 1, 0 };
public void bubbleSort() {
for (int i = 0; i < a.length; i++) {
// 算法设计:
// 1.初始化:a[0,i]即a[0]有序
// 2.不变式:a[0,i]有序==>加入a[i+1]即a[j]后,保持a[0,i+1]有序
// -->实现:通过依次对a[j]<a[j-1]-->a[i,0]比较判断,然后交换位置确保有序
// 3.终止:a[0,a.length]有序
// 因为a[0,i]有序,可以将a[j] < a[j - 1]放入for内部,等同于while的条件
for (int j = i + 1; j > 0 && a[j] < a[j - 1]; j--) {
int x = a[j];
System.out.println("x=a[" + j + "]" + "=" + x);
a[j] = a[j - 1];
a[j - 1] = x;
}
show(a);
}
}
public void show(int a[]) {
StringBuffer arr = new StringBuffer("[");
for (int i = 0; i < a.length; i++) {
arr.append(a[i] + ",");
}
arr.deleteCharAt(arr.lastIndexOf(","));
arr.append("]");
System.out.println(arr.toString());
}
public static void main(String[] args) {
BubbleDemo bubble = new BubbleDemo();
bubble.bubbleSort();
}
}
插入排序,从数字依次取出元素插入到有序部分的队列中
Demo如下:
package sort.demo;
//插入排序,从数字依次取出元素插入到有序部分的队列中
public class InsertDemo {
static int sort = 0;
// int[] a = { 1, 5, 2, 4, 3, 7, 0 };
int[] a = { 6, 5, 4, 3, 2, 1, 0 };
public void insert() {
for (int i = 1; i < a.length; i++) {
// 1.初始化x和k,即:待插入值a[i],空位索引j
int x = a[i];
int j = i - 1;
System.out.println("x=a[" + i + "]" + "=" + x);
// 2. 将有序队列中比 x 大的值 a[j] 依次右移,j--循环同时记录也是记录空位索引
for (; j >= 0 && x < a[j]; j--) {
a[j + 1] = a[j];
}
// 3.插入x
a[j] = x;
show(a);
}
}
// 算法细节说明版本
// 初始化:a{a[0]},即a[0]有序,a[i,a.length]无序
// 不变式:保持a[0,i-1]==>加入a[i]后a[0,i]有序
// 实现:x暂存a[i]并比较a[j]-->a[i-1,0],找出正确的空位索引后插入x,使a[1,i]有序
// 终止:a[0,i-1]加入a[i]即:a[0,a.length]有序
public void ascInsertWithDescIndex() {
for (int i = 1; i < a.length; i++) {
// 1. x暂存待插入值a[i], 初始化空位索引
int x = a[i];
int j = i - 1;
// x=a[i]-->a[1,a.length-1]迭代比较a[j]-->a[0,i-1]
while (j >= 0 && x < a[j]) {
// 2.比x大的值a[j]右移,同时空位索引减一
a[j + 1] = a[j];
j--;
}
// 3.插入
a[j] = x;
show(a);
}
}
}
选择排序是指在无序部分队列中选择出最小的元素,放入有序队列末尾
package sort.demo;
//在无序的队列中选择出最小的元素,放入有序队列末尾
public class SelectDemo {
// int[] a = { 6, 5, 4, 3, 2, 1, 0 };
int[] a = { 8, 5, 5, 2, 4, 3, 7, 0 };
// 算法说明
public void ascSelectAscIndex() {
// 初始化: a[0,i]即a[0]有序, min = a[0], a[1,a.length]无序
// 保持不变式:a[0,i]有序==>加入a[i+1]即a[j]-->a[i,a.length-1]后,a[0,i+1]有序
// 算法实现:k标记最小值索引,遍历a[j]-->a[i,a.length-1]比较a[k]最终找出最小值的索引赋值给k,
// 终止:a[0,a.length]有序,同时内部循环j初始化a.length即:无序队列为null
for (int i = 0; i < a.length; i++) {
// 1.初始化min索引k
int k = i;
// 2.找出min对应的索引,a[i,a.length]无序,必须用for循环,且不能将判断条件放入for内
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[k]) {
k = j;
}
// 3.通过索引互换
int min = a[k];
System.out.println("min值a[" + k + "]" + "=" + a[k]);
a[k] = a[i];
a[i] = min;
show(a);
}
}
}
}
冒泡是一种流行但效率低的算法,具体通过反复交换相邻未排序的元素
算法实现通过经典java 演示进行阐述
//冒泡是一种流行但效率低的算法,反复交换相邻未排序的元素
public class BubbleDemo {
// int[] a = { 1, 5, 2, 4, 3, 7, 0 };
int[] a = { 6, 5, 4, 3, 2, 1, 0 };
public void bubbleSort() {
for (int i = 0; i < a.length; i++) {
// 算法设计:
// 1.初始化:a[0,i]即a[0]有序
// 2.不变式:a[0,i]有序==>加入a[i+1]即a[j]后,保持a[0,i+1]有序
// -->实现:通过依次对a[j]<a[j-1]-->a[i,0]比较判断,然后交换位置确保有序
// 3.终止:a[0,a.length]有序
// 因为a[0,i]有序,可以将a[j] < a[j - 1]放入for内部,等同于while的条件
for (int j = i + 1; j > 0 && a[j] < a[j - 1]; j--) {
int x = a[j];
System.out.println("x=a[" + j + "]" + "=" + x);
a[j] = a[j - 1];
a[j - 1] = x;
}
show(a);
}
}
public void show(int a[]) {
StringBuffer arr = new StringBuffer("[");
for (int i = 0; i < a.length; i++) {
arr.append(a[i] + ",");
}
arr.deleteCharAt(arr.lastIndexOf(","));
arr.append("]");
System.out.println(arr.toString());
}
public static void main(String[] args) {
BubbleDemo bubble = new BubbleDemo();
bubble.bubbleSort();
}
}
插入排序,从数字依次取出元素插入到有序部分的队列中
Demo如下:
package sort.demo;
//插入排序,从数字依次取出元素插入到有序部分的队列中
public class InsertDemo {
static int sort = 0;
// int[] a = { 1, 5, 2, 4, 3, 7, 0 };
int[] a = { 6, 5, 4, 3, 2, 1, 0 };
public void insert() {
for (int i = 1; i < a.length; i++) {
// 1.初始化x和k,即:待插入值a[i],空位索引j
int x = a[i];
int j = i - 1;
System.out.println("x=a[" + i + "]" + "=" + x);
// 2. 将有序队列中比 x 大的值 a[j] 依次右移,j--循环同时记录也是记录空位索引
for (; j >= 0 && x < a[j]; j--) {
a[j + 1] = a[j];
}
// 3.插入x
a[j] = x;
show(a);
}
}
// 算法细节说明版本
// 初始化:a{a[0]},即a[0]有序,a[i,a.length]无序
// 不变式:保持a[0,i-1]==>加入a[i]后a[0,i]有序
// 实现:x暂存a[i]并比较a[j]-->a[i-1,0],找出正确的空位索引后插入x,使a[1,i]有序
// 终止:a[0,i-1]加入a[i]即:a[0,a.length]有序
public void ascInsertWithDescIndex() {
for (int i = 1; i < a.length; i++) {
// 1. x暂存待插入值a[i], 初始化空位索引
int x = a[i];
int j = i - 1;
// x=a[i]-->a[1,a.length-1]迭代比较a[j]-->a[0,i-1]
while (j >= 0 && x < a[j]) {
// 2.比x大的值a[j]右移,同时空位索引减一
a[j + 1] = a[j];
j--;
}
// 3.插入
a[j] = x;
show(a);
}
}
}
选择排序是指在无序部分队列中选择出最小的元素,放入有序队列末尾
package sort.demo;
//在无序的队列中选择出最小的元素,放入有序队列末尾
public class SelectDemo {
// int[] a = { 6, 5, 4, 3, 2, 1, 0 };
int[] a = { 8, 5, 5, 2, 4, 3, 7, 0 };
// 算法说明
public void ascSelectAscIndex() {
// 初始化: a[0,i]即a[0]有序, min = a[0], a[1,a.length]无序
// 保持不变式:a[0,i]有序==>加入a[i+1]即a[j]-->a[i,a.length-1]后,a[0,i+1]有序
// 算法实现:k标记最小值索引,遍历a[j]-->a[i,a.length-1]比较a[k]最终找出最小值的索引赋值给k,
// 终止:a[0,a.length]有序,同时内部循环j初始化a.length即:无序队列为null
for (int i = 0; i < a.length; i++) {
// 1.初始化min索引k
int k = i;
// 2.找出min对应的索引,a[i,a.length]无序,必须用for循环,且不能将判断条件放入for内
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[k]) {
k = j;
}
// 3.通过索引互换
int min = a[k];
System.out.println("min值a[" + k + "]" + "=" + a[k]);
a[k] = a[i];
a[i] = min;
show(a);
}
}
}
}
相关文章推荐
- Linux之计划任务
- 在Centos7中安装Mind Mapping Tool Xind
- 基于Flume的美团日志收集系统(二)改进和优化
- java初学 Scanner 中 输入数字和字符串的方法
- Elasticsearch笔记二之Curl工具基本操作
- PAT (Basic Level) Practise-1009. 说反话 (20)
- spoj Simple Average
- 【Android】自定义View —— 环形调色板
- javascript dom操作
- Java 数字与字符串互转
- UVA 1025 A Spy in the Metro [动态规划] [DAGdp]
- 基于Flume的美团日志收集系统(一)架构和设计
- 牛顿迭代法 立方
- background的属性和背景图片定位的实例
- Linux下的hostname命令详解
- View 的绘制流程
- 网易笔试题--混合颜色(异或)
- python小记(5)
- zz android 版本号,version code与version name
- 软连接、硬链接、磁盘分区管理(笔记)