记录一下基本的三种排序算法,也顺便复习一下时间复杂度的计算。
先是简单的交换,之后会用到
private static void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
一、冒泡排序
依次将每个位置上的数字与逐一与其之后的数字进行比较
public static void BubbleSort(int arr[]) {
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
swap(arr, i, j);
}
}
}
}
时间复杂度计算:(n-1)+(n-2)+…..+2+1+0≈n*(n-1)/2
时间复杂度不考虑系数,所以冒泡的时间复杂度是:O(n^2)
二、选择排序
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
public static void SelectSort(int arr[]) {
for (int i = 0; i < arr.length; i++) {
int index = i;//标记选择的数的下标,初始为第一个数
for (int j = i + 1; j < arr.length; j++) {//遍历未排序区,找出未排序区最小的数
if (arr[index] > arr[j]) {//未排序区有比标记数小的
index = j;//将这个小的数标记下
}
}
if (index != i) {//如果这个小的数,不是一
swap(arr, index, i);
}
}
}
时间复杂度计算:(n-1)+(n-2)+…..+2+1+0≈n*(n-1)/2
时间复杂度不考虑系数,所以冒泡的时间复杂度是:O(n^2)
三、插入排序
每次取出无序区中的第一个元素,插入到有序区中
public static void InsertSort(int arr[]) {
//有序区的最后一个元素下标
int index = 0;
for (int i = index + 1; i < arr.length; i++) {//有序区往上即是未排序区
int insertIndex = i;//记录要在有序区的插入位置的下标,刚开始即是未排序位置的第一个数的下标
int temp = arr[i];//记录下要在有序区插入的值,刚开始即是未排序区的第一个数
for (int j = index; j >= 0; j--) {//有序区从后往前比较
if (arr[j] < temp) {//当有序区有比插入的数要大的
arr[j + 1] = arr[j];//有序区一位一位右移
insertIndex--;//一位一位将要插入的数的下标移到目标位置
} else {//一定要加判断,不然无法一位一位的移动
break;
}
}
arr[insertIndex] = temp;//将要插入的数赋值给目的下标所在的位置
index++;//有序区范围扩大一位数
}
}
时间复杂度计算:(n-1)+…+2+1= n*n/2
时间复杂度不考虑系数,所以冒泡的时间复杂度是:O(n^2)
四、结束语
以上都是自我的知识整理,如有错误欢迎指正!尤其是时间复杂度的计算,完全是看自己写的循环次数….
希望自己能成长的快一点吧!