我是野猪。
排序: 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。对数据进行排序有可能是检索的一个初始步骤。二分查找比线性查找要快的多,然而它只能应用于有序的数据。其次排序非常重要也可能非常耗时。
冒泡排序、选择排序和插入排序都是简单排序,算法时间复杂度都是O(n^2)。
插入排序:每一步都将一个待排的数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
java代码:
/**
* 插入排序
* 插入排序的时间复杂度分析:
* 比较次数是1+....+N-1 比较次数为O(N方) 也就是说冒泡 选择 插入排序的比较都是O(N方)
* 冒泡交换的次数是O(N 方) 选择交换的次数是O(N)
* 那么插入排序的好处在哪呢?
*
*/
public class InsertSort {
public static void main(String[] args) {
int sore[] = {3, 1, 4, 63};
for (int i = 1; i < sore.length; i++) {//第一次是把首位的元素当成一个有序 从i=1开始与之比较
int temp = sore[i];//待排序的元素
int insertLocation = i - 1;//与 temp(待排序元素的) 比较的数值下标
while (insertLocation >= 0 && sore[insertLocation] > temp) {
sore[insertLocation + 1] = sore[insertLocation];//后移一位
insertLocation--;//接着和前一位比较 直到队头insertLocation = 0
}
sore[insertLocation + 1] = temp;//至于要不要+1,可以简单的这样想:2个元素[3,1]时,跳出while循环是insertLocation=-1
}
System.out.println("直接插入排序(从小到大):");
for (int i : sore) {
System.out.println(i + "");
}
}
}
插入排序:
首先,对于小规模的文件以及基本有序的文件,插入排序能比快排更为有效。一般情况下,它比冒泡排序快一倍,比选择排序还要快一点,而且经常被用在较复杂的排序算法的最后阶段,比如快速排序。
其次,对于已经有序或者基本有序的数据来说,插入排序要好得多。当数据有序的时候,while循环的条件总是假,所以它变成了外层循环中国的一个简单语句,执行N-1次。这种情况下,算法运行只需要O(N)的时间。也就是说如果数据基本有序,插入排序几乎只需要O(N)的时间,但是,对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不比冒泡排序快。
对简单排序,冒泡排序、选择排序和插入排序做一个简单的总结:
简单排序所有的算法时间复杂度都是O(N^2)。不过某些情况下某个算法可以比其他算法快很多。
冒泡排序:冒泡排序是效率最差的算法,但他最简单。一般情况下不太使用,当数据量很小的时候会有些应用的价值。
选择排序:把交换次数降到最低,但比较的次数仍然很大。当数据量很小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。
插入排序:在大多数情况下,假设当数据量比较小或基本上有序时,插入排序算法是三种简单排序算法中的最好的选择。对于更大数据量的排序来说,快排则是最快的方法。
补充:另一个衡量算法的标准是需要的内存空间有多大。简单排序都是除了初始数组外几乎不需要其他内存空间。
如有问题,请及时指出。