您的位置:首页 > 其它

冒泡,选择,插入三大基本排序解析以及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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: