冒泡排序:
冒泡排序是一种简单的排序算法。它重复的遍历需要排序的数列,一次比较两个元素,如果它们的顺序错误就对这两个元素进行位置调换。重复的进行此操作,直到没有需要交换说明排序完成。
执行描述:
比较相邻的元素。如果第一个比第二个大,就交换它们两个。
然后继续进行比较第二个与第三个,如果第二个比第三个大,就交换它们两个。
依次类推假如有N个元素,最后一次比较第N-1个与N个,通过上述比较,这样在最后的元素应该会是最大的数。
在进行下一次比较同样是从第一个开始不够结束位置变为了第N-1个(最后一个已经为最的的元素无需在进行比较)
以此类推直到没有需要交换说明排序完成。
代码实现(java):
/**
* 冒泡排序(升序)
*/
public static int[] bubbleSort(int[] array) {
if (array.length > 0) {
boolean b = true;
for (int i = 0; i < array.length; i++) {
if (b) {
b = false;
}else{
return array;
}
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int item = array[j];
array[j] = array[j + 1];
array[j + 1] = item;
b = true;
}
}
}
}
return array;
}
在每一次遍历交换之前判断布尔值(判断上次整体遍历是否进行了交换),若没有交换说明已经排序完成不需要进行遍历比较,直接返回数组,若进行了就继续下一次遍历交换。
选择排序:
选择排序是一种简单直观的排序算法。重复的遍历对数组进行比较,找到最大(最小)的元素将其移动到数组的开头,以此类推,直到所有元素均排序完成。
执行描述:
第一次比较第一个第二个,抽取其中较小的元素。
然后将较小的元素继续与第三个进行比较。
以此类推假如有N个元素,最后一次将较小的元素与第N个元素进行比较,抽取出最小的元素与第一个元素位置进行互换,通过上述比较这样在开头的元素应该会是最小的数。
在进行下一次比较,不过开始位置变成了第二个元素结束位置已经是第N个不变(第一个已经为最小元素无需在进行比较),抽出最小的数将其与第二个元素进行交换。
以此类推直到所有元素均排序完成。
代码实现:
/**
* 选择排序
*/
public static int[] selectionSort(int[] array) {
if (array.length > 0) {
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
int item = array[minIndex];
array[minIndex] = array[i];
array[i] = item;
}
}
return array;
}
总结:
冒泡排序和选择排序非常相似
冒泡排序是相邻比较调换顺序(频繁的调换顺序)
选择排序是遍历比较记录最大(小)值最后进行调换顺序(极少的调换顺序)
两者相比冒泡排序所耗费的空间资源比较大。
选择排序在大多数情况下要优于冒泡排序。