对数组中的数据进行排序,主要有以下四种方法:
- 冒泡排序
- 直接插入排序
- 选择排序
- Shell排序
(一)冒泡排序法:
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
- 稳定性:稳定
冒泡排序法的核心思想是将大的数据看作大的气泡,小的数据看作小的气泡,大的气泡降下去,小的气泡升上来。如图:
如图,对数组中元素进行第一次排序,使1浮上来,将8沉了下去。
代码示例:
public static void main(String[] args) {
int[] array={2,5,8,3,1,6,7,4,9};
for (int i = 0; i <array.length-1 ; i++) {
for (int j = 0; j <array.length-1-i ; j++) {
if(array[j]>array[j+1]) {
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
System.out.println(Arrays.toString(array));
}
}
(二)直接插入排序
- 越有序越快
- 时间复杂度:
无序:o(n^2)
有序:o(n) - 空间复杂度:o(1)
- 稳定性:稳定 没有出现跳跃式的交换
直接插入排序核心思想是将第i个数字上拿出来给tmp,将j(i-1)上的数字与tmp比较,满足(array[j]>tmp)时将array[j]上的数字赋给array[j+1] 然后j-1,再次判断(array[j]>tmp),如果满足,则将array[j]上的数字赋给array[j+1],否则将tmp的值赋给array[j+1] ,如此i++,判断所有数字;如图:
public static void insertSort(int[] array){
int tmp;
for (int i = 1; i <array.length ; i++) {
tmp=array[i];
int j=0;
for ( j = i-1; j >=0 ; j--) {
if(array[j]>tmp){
array[j+1]=array[j];
}else{
break;
}
}
array[j+1]=tmp;
}
}
(三)选择排序
- 时间复杂度:o(n^2)
- 空间复杂度:o(1)
- 稳定性:不稳定
选择排序与冒泡排序比较相似,所以在我们不熟悉冒泡排序的时候容易将冒泡排序写成选择排序,选择排序的基本思想如图:
代码示例:
public static void selectSort(int[] array){
int tmp=0;
for (int i = 0; i <array.length ; i++) {
for (int j = i+1; j <array.length ; j++) {
if(array[i]>array[j]){
tmp=array[j];
array[j]=array[i];
array[i]=tmp;
}
}
}
System.out.println(Arrays.toString(array));
}
(四)shell排序
- 时间复杂度:O(n^1.3 – ^1.5)
- 空间复杂度:O(1)
- 稳定性:不稳定
特点:
- 快速
- 增量序列: 总为质数 即除了它本身和1没有其他因子
shell排序的思想是先分组,进行组内插入排序。如图:
代码示例:
public class shellSort {
public static void shell(int[] array, int gap) {
int tmp = 0;
for (int i = gap; i < array.length; i++) {
tmp = array[i];
int j = 0;
for (j = i - gap; j >= 0; j -= gap) {
if (array[j] > tmp) {
array[j + gap] = array[j];
} else {
break;
}
}
array[j + gap] = tmp;
}
}
public static void shellSort(int[] array) {
int drr[] = {5, 3, 1}; //增量序列
for (int i = 0; i < drr.length; i++) {
shell(array, drr[i]);
}
}
public static void main(String[] args) {
int[] array = {12, 7, 2, 8, 15, 67, 94, 34, 16, 13, 31, 27, 65, 82, 21};
shellSort(array);
System.out.println(Arrays.toString(array));
}
}