对于一个排序算法,一般从3个方面衡量算法的优劣:
时间复杂度:主要分析关键字的比较次数和记录的移动次数。
空间复杂度:分析排序算法中需要多少辅助内存。
稳定性:若两个记录A和B的关键字值相等,但排序后A,B的先后次序保持不变,则称这种算法是稳定的;反之,就是不稳定的。
O(n^2)表示输入数据量增大n倍,耗时就会增大n的平方倍。O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。
1.冒泡排序
-
比较相邻的元素,如果第一个比第二个大,则交换它们两个
-
对每一对相邻的元素都进行比较,从开始到最后,此时最后一个应该是最大的值
-
重复以上步骤,直至排序完成
/**
* @Author: zyl
* @description:
* @Date: Created in 14:36 2021/3/10
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
int[] arr={23,35,2,76,14,66,46};
//外层循环,遍历次数
for(int i=0;i<arr.length;i++){
//内存循环
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
2.插入排序
-
从第一个元素开始,该元素可以认为已经被排序;
-
取出下一个元素,从已排序的元素序列中从后向前扫描;
-
如果小于已排序的元素,将该元素往前移一个位置
-
重复上一条,直到找到已排序的元素小于或等于新元素的位置
-
将新元素插入到该位置后,重复以上步骤,直到排序完成
public static void main(String[] args) {
int[] arr = {23, 35, 2, 76, 14, 66, 46};
for(int i=0;i<arr.length;i++){
for(int j=i;j>0;j--){
if(arr[j]<arr[j-1]){
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}else {
break;
}
}
}
System.out.println(Arrays.toString(arr));
}
3.选择排序
-
将第一个值看成最小值
-
和后续的比较找出最小值和下标
-
交换本次遍历的起始值和最小值
-
每次遍历,找出后面无序序列的最小值,将最小值放入到有序序列的末尾,直到排序完成
public static void main(String[] args) {
int[] arr = {23, 35, 2, 76, 14, 66, 46};
int position=0;
for(int i=0;i<arr.length;i++){
position = i;
int temp = arr[i];
for(int j=i+1;j<arr.length;j++){
if(arr[j]<temp){
temp=arr[j];
position=j;
}
}
arr[position] = arr[i];
arr[i]=temp;
}
System.out.println(Arrays.toString(arr));
}