接着上文说,这里,简单的分析下冒泡和选择之间的优劣之处:
- 在冒泡排序中,当数据项的个数N较大时,算法做了N*N/2次比较,大概有一半的数据需要交换,则是N的平方/4。算法的运行时间为O(N*N)级。
- 在选择排序中,当数据项的个数N较大时,和冒泡排序的比较次数一样,但是交换次数要少,所以,选择排序无疑最快。算法的运行时间为O(N*N)级。
说说插入排序。我的理解是:插入排序它有个要求,就是假设局部是有序的。而在冒泡和选择排序中,是不会出现局部有序的。什么意思呢?例如一队人按身高从矮到高的次序排列,冒泡和选择则是完全随机的,而插入则是前面几个人是按照排序的要求站的,只需要把后面没有按照排序要求站队的人安排好次序就行了。那这就需要一个标记元素,标记元素的左边是排好序的,右边是无序的。而被标记的人,需要先站到一边,然后左边排好序的人分别往右边移动一个位置,每移动一个,需要和被标记的人进行比较,直到被标记的人的身高大于或等于移动的人的身高,此时排序结束。
代码如下:
public class InsertSort {
public static void main(String[] args) {
InsertSort insertSort = new InsertSort();
int[] b = new int[] { 0, 1, 9, 3, 2, 54, 32 ,3};
insertSort.insertSort(b);
}
private static void insertSort(int[] arr) {
int in, out;//out是被标记的元素,in是局部有序的数据项下标
for (out = 1; out < arr.length; out++) {
int temp = arr[out];//把被标记的元素拿出来
in = out;//局部有序的下标从被拿出来的元素的下标开始
while (in > 0 && arr[in - 1] <= temp) {//往右边移动位置且移动的元素和被标记的元素比较大小
arr[in] = arr[in - 1];//交换位置
in--;
}
arr[in] = temp;//比较结束,插入被标记元素
}
for (int i : arr) {
System.out.print(i + ",");
}
}
}