开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,[点击查看活动详情]
两大类
比较类排序
通过比较来决定元素间的相对次序,时间复杂度不能超过O(nlogn),非线性时间比较类排序。
选择排序,冒泡排序,插入排序,希尔排序,归并排序,堆排序,快速排序。
非比较类排序
不通过比较来决定元素间的相对次序,可以突破基于比较排序的时间下界,以线性时间运行。线性时间非排序。
计数排序,桶排序,基数排序。
概念
1,稳定:如果A原本在B前面,而A==B,排序之后A仍在B的前面。
2,不稳定:如果A原本在B前面,而A==B,排序之后A可能会出现在B的后面。
3,时间复杂度:对排序数据的总的操作次数,反映当n变化时,操作次数呈现什么规律。
4,空间复杂度:指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
选择排序
Selection-sort.
排序原理
1,在未排序的序列中找到最大(小)元素,放到排序序列的起始位置。
2,再剩余未排序中继续寻找,放到已排序序列的末尾。
3,以此类推,到所有元素均排序完毕。
特点
时间复杂度为O(n^2)
空间复杂度为S(1):原地进行排序。
是不稳定的。
代码
public class SelectionSort{
public static void main(String[] args){
int[] arr={9,1,8,2,7,3,6,4,5};
selectionSort(arr);
System.out.println(Arrays.toString(arr));//将数组创建成字符串形式
}
private static void selectionSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
swap(arr,i,j);
}
}
}
}
private static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
冒泡排序
Bubble-Sort
排序原理
一次比较两个元素,顺序错误就交换,直到没有再需要交换。
特点
时间复杂度:O(n^2)
空间复杂度为S(1)
是稳定的。
代码
import java.util.Arrays;
public class BubbleSort{
public static void main(String[] args){
int[] arr={9,1,8,2,7,3,6,4,5};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void bubbleSort(int[] arr){
for(int i = 0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i,j++){
if(arr[i]>arr[j]){
swap(arr,j,j+1);
}
}
}
}
private static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}