您的位置:首页 > 其它

简单的排序--冒泡、选择、插入

2017-04-06 14:58 260 查看

版权声明:尊重博主原创文章,转载请注明出处

引言

对数据进行排序是经常需要做的事情,下面介绍三种简单的排序。这三个算法都包含如下步骤,这两步循环执行,直到数据全部有序为止:
1.比较两个数据项。
2.交换两个数据项,或复制其中一项。
但是,每种算法具体实现的细节有所不同。每个方法都是一个排序算法。
/**
* @Description Sort 简单排序算法 时间复杂度都是O(n²)
* @Author weihuiming
* @Date 2017年4月6日 下午12:57:26
*/
public class Sort {

/*
* 排序的数组
*/
private long[] num;

/*
* 数组中的个数
*/
private int size;

/**
* @Description 冒泡排序 时间复杂度 O(n²) 比较次数 O(n²) 交换次数O(n²)
* @Author weihuiming
* @Date 2017年4月6日下午1:16:39
*/
public void bubbleSort(){
// out右边的所有数据都是有序的 具有(不变性) 在算法运行过程中这个条件始终为真
for (int out = size - 1; out > 0; out--) {
// 对数组进行循环比较
for (int i = 0; i < out; i++) {
// 如果前面的数大于后面的数 进行位置交换
if (num[i] > num[i+1]) {
swap(i, i+1);
}
}
}
}

/**
* @Description 选择排序 时间复杂度 O(n²) 比较次数 O(n²) 交换次数O(n)
* @Author weihuiming
* @Date 2017年4月6日下午1:34:14
*/
public void selectionSort(){
// 最小值记录
int min;
// 下标小于或者等于out位置上的所有数据都是有序的 具有(不变性) 在算法运行过程中这个条件始终为真
for (int out = 0; out < size - 1; out++) {
// 获取第out下坐标
min = out;
// 从out后一位开始比较
for (int in = out + 1; in < size; in++) {
// 如果比较的数小于最小数
if (num[in] < num[min]) {
// 重新获取最小数的位置
min = in;
}
// 把最小数和out上的进行交换
swap(out, min);
}
}
}

/**
* @Description 插入排序 无序的:时间复杂度 O(n²) 比较次数 O(n²) 交换次数O(n)
* 基本有序的: 时间复杂度 O(n) 比较次数 O(n²) 交换次数O(n)
* @Author weihuiming
* @Date 2017年4月6日下午2:07:16
*/
public void insertionSort(){
// 每次循环结束,再将temp数据插入后,比out位置小的数据都是局部有效的 具有(不变性) 在算法运行过程中这个条件始终为真
for (int out = 1; out < size; out++) {
// 记录要比较的数
long temp = num[out];
// 记录位置
int in = out;
// 当前位置必须大于0,并且 当前位置前一位数必须大于或者等于 要比较的数
while (in > 0 && num[in - 1] >= temp) {
// 把当前位置和当前位置的前一位进行交换
num[in] = num[in - 1];
// 减去当前位置 继续进行判断
--in;
}
// 把要比较的数放到合适的位置
num[in] = temp;
}
}

/**
* @Description 对两个数进行交换
* @Author weihuiming
* @Date 2017年4月6日下午1:14:42
* @param one 第一个数的下坐标
* @param two 第二个数的下坐标
*/
private void swap(int one, int two) {
long temp = num[one];
num[one] = num[two];
num[two] = temp;
}
}


算法之间的简单比较

冒泡算法:过于简单,可以毫不费力的写出来。当数据量很小的时候会有他的应用价值。选择排序:把交换次数降到最低,比较次数仍然很大。当数据量很小,并且交换数据相对于比较数据更加耗时的情况下,可以选择应用。(目前不知道很小是什么意思)插入排序:在大多数情况下,假设当前数据量比较小或基本上有序时,插入排序算法是三种简单排序算法中最好的选择,对于更大数据量的排序来说,快速排序通常是最快的方法。除了速度方面比较排序算法,还需要衡量标准算法需要的内存空间有多大。不同的数据量,不同的系统等等环境都是影响算法速度的原因。

小结

排序包括比较数组中数据项的关键字和移动相应的数据项(实际上,是数据项的引用),直到它们排好序为止。
这三个算法的时间复杂度都是O(n²)。不过,某些情况下某个算法可以比其他算法快很多。
不变性是指在算法运行时保持不变的条件。
冒泡排序算法是效率最差的算法,但它最简单。
如果具有相同关键字的数据项,经过排序它们的顺序保持不变,这样的排序是稳定的。
目前已经放到git上。地址是https://github.com/xinweimingtian/algorithm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐