常见的几种排序算法
1.冒泡排序 时间复杂度:O(n^2) 空间复杂度:O(1)
2.选择排序 时间复杂度:O(n^2) 空间复杂度:O(1)
3.插入排序 时间复杂度:O(n^2) 空间复杂度:O(1)
4.希尔排序 时间复杂度:O(nlogn) 空间复杂度:O(1)
5.归并排序 时间复杂度:O(nlogn) 空间复杂度:O(n)
6.快速排序 时间复杂度:O(nlogn) 空间复杂度:O(logn)
7.堆排序 时间复杂度:O(nlogn) 空间复杂度:O(1)
8.计数排序 时间复杂度:O(n+k) 空间复杂度:O(k)
9.桶排序 时间复杂度:O(n+k) 空间复杂度:O(n+k)
10.基数排序 时间复杂度:O(n*k) 空间复杂度:O(n+k)
在这里只做几个排序的笔记:选择排序,插入排序和简单介绍基数排序。
选择排序
用一个动图康康选择排序是怎么排的
选择排序是一次一次的遍历数组,寻找当中最小的那个值,依次往前排。
看懂了选择排序是怎么排的,接下来康康代码是怎么实现的:
/**
* 选择排序
* @param array
* @return
*/
public static int[] selectionSort(int[] array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) //找到最小的数
minIndex = j; //将最小数的索引保存
}
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
return array;
}
插入排序
用一个动图康康插入排序是怎样的
一个一个的比较,小的那个值往前插入
再康康一个动图,加强理解
我们来康康代码:
/**
* 插入排序
* @param array
* @return
*/
public static int[] insertionSort(int[] array) {
if (array.length == 0) //数组长度为0;
return array; //直接返回
int current;
for (int i = 0; i < array.length - 1; i++) { //遍历数组,从0到数组长度-1
current = array[i + 1]; //用一个current记录当前下标i+1的值,也就是从第二个开始直到最后一个元素
int preIndex = i; //用preIndex记录i,也就是从第一个元素开始
while (preIndex >= 0 && current < array[preIndex]) {
array[preIndex + 1] = array[preIndex]; //数组preIndex + 1下标指向它前一个元素
preIndex--; //继续往前比较
}
array[preIndex + 1] = current; //被替换的那个值,
}
return array;
}
基数排序
基数排序算是一个比较有趣的排序方法,其是按照个位数依次叠放排序,再按照十位数排,再依次排放即排序完成。
我们来康康动图,理解一下是怎么排的吧。