1.冒泡排序
冒泡排序是最简单的排序方法,分为内外两层for循环。外层循序代表的是总共要跑的趟数,2个数据比较一趟。3个数据比较两趟,以此类推,n个数据就跑n-1趟。内层循环是真正比价数据大小的。每次比较都会讲大的数据放到后面。代码如下:
private static void bubbleSort(int datas[]) {
int temp;
for (int i = 0; i < - 1; i++) {
for (int j = i + 1; j < ; j++) {
if (datas[j] < datas[i]) {//交换数据
temp = datas[j];
datas[j] = datas[i];
datas[i] = temp;
}
}
}
}
2.选择排序
选择排序原理是先将数组中最小的元素找到并且标记,即记录最小数据的下标,将找到的最小元素移动到最左侧,也就是目前的下标最小的位置,下次比较就除去上次找到并且移动的最小值,对剩下数据继续重复上述操作,直到排序结束。选择排序其实可以算是对冒泡排序的一个优化,区别就是冒泡排序每次比较完将大小不对数据进行交换,选择排序跟冒泡的对比时间复杂度是一样的,只是每次内循环都将数据最小的角标标记,然后再交换数据,所以选择排序的数据交换时间复杂度是低于冒泡排序的,代码如下:
private static void chooseSort(int[] datas) {
int minIndex;
int temp;
for (int i = 0; i < - 1; i++) {
minIndex = i;
for (int j = i + 1; j < ; j++) {
if (datas[j] < datas[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
temp = datas[minIndex];
datas[minIndex] = datas[i];
datas[i] = temp;
}
}
}
3.插入排序
原理:插入排序会将目前基本有序的一部分数组提取出来,然后将这部分数组的最右侧的一个元素的右侧元素做标记,将这个元素与前面基本有序的数组进行比较,找到比他稍大的元素,并且移动到比他稍大的元素前面,剩余的未排序元素重复执行上述操作,知道排序结束。所以插入排序的时间复杂度与他的基本有序部分的大小有关,如果数组是正好逆序的,他的时间复杂度甚至不会比,冒泡排序高。
private static void insertSort(int[] datas) {
int temp;
for (int i = 1; i < ; i++) {
temp = datas[i];
int j = i;
for (; j > 0 && temp < datas[j - 1]; j--) {
datas[j] = datas[j - 1];
}
datas[j] = temp;
}
}
4.应用场景
冒泡排序:使用最简单,适用于数据量很小的排序场景。
选择排序:适用于大多数排序场景,虽然他的对比次数较多,但是数据量大的时候,他的效率明显优于冒泡,而且数据移动是非常耗时的,选择排序移动次数少。
插入排序:插入排序适用于已有部分数据有序的情况,有序部分越大越好。