排序算法
排序算法
排序算法的介绍
- 排序算法是将一组数据,依指定的顺序进行排列的过程
排序的分类
内部排序
指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。
外部排序法
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。
算法的时间复杂度
- 时间频度:一个算法中的语句执行次数称为时间频度T(n)
- 常见的时间复杂度
- 常数阶O(1)
- 对数阶O(log2n)
- 线性阶O(n)
- 线性对数阶O(nlog2n)
- 平方阶O(n^2)
- 立方阶O(n^3)
- K次方阶O(n^k)
- 指数阶O(2^n)
冒泡排序
基本介绍
通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,值较大的元素逐渐从前移向后部。
冒泡排序规则
- 一共进行数组大小-1次大的循环
- 每一趟循环的次数在逐渐减少
- 如果我们发现在某趟排序中,没有发生一次交换,可以提前结束冒泡排序,这个就是优化。
代码实现
public static void bubbleSort(int[] arr) {
boolean flag = false;//标识变量,表示是否进行交换
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
int a = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = a;
}
}
if (flag != true) {//说明一次都没有交换
break;
} else {
flag = false; //重置flag ,进行下次判断
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}冒泡排序的时间复杂度是O(n^2)
选择排序
基本介绍
就是遍历整个数组找到数组当中最小的值并与arr[0] 交换,接着,从arr[1]-arr[n]开始遍历数组,再次找到最小值并和arr[1]交换
思路说明
选择排序一共有数组大小-1轮排序
每一轮排序,又是一个循环
- 先假定当前这个数就是最小数
- 然后和后面的每个数进行比较,如果发现有比这个数更小的数,就重新确定这个最小数,并得到下标
- 当遍历到数组的最后时,就得到本轮最小数和小标
- 进行交换
代码实现
//选择排序
public static void selectort(int[] arr){
for (int i = 0; i <arr.length-1; i++) {
int min = arr[i];
for (int j = i+1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
min =arr[j]; //重置最小值
arr[j] =arr[i];
arr[i] =min;
}
}
}
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]+" ");
}
}
- 选择排序的时间复杂度n(n^2)
插入排序
基本介绍
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将他插入到有序表中的适当位置,使之成为新的有序表。
代码实现
public static void insertSort(int arr[]){
for (int i = 1; i <arr.length ; i++) {
//定义待插入的数
int insertVal = arr[i];
int insertIndex = i-1;
while (insertIndex >=0 && insertVal < arr[insertIndex]){
arr[insertIndex +1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex +1] =insertVal;
}
System.out.println(Arrays.toString(arr));
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 李福腾の博客!