十大经典排序算法有
1 冒泡排序 2.选择排序 3.插入排序 4.计数排序 5.希尔排序
6.归并排序 7.堆排序 8.快速排序 9.桶排序 10.基数排序
1.冒泡排序
1.概念:冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
class Test02{
public static void main(String[] args){
//1.选择排序O(n^2)
selectSort();
//2.冒泡排序O(n^2)
bubbleSort();
//3.插入排序O(n^2)
insertSort();
//4.计数排序O(n+m)
countSort();
}
具体代码实现方法
public static void bubbleSort(){
int[] arr={3 44 38 5 47 15 36 26 27 2 46 4 19 50 48};
for(int i=0;i<arr.length-1;i++){//-1是少一轮比较
for(int j=0;j<arr.length-1-i;j++){//-1避免重复比较和角标越界
if(arr[j]>arr[j+1]){
swap(arr,j,j+1); //交换在最后统一
}
}
}
show(arr); //show方法在最后统一写出
}
2.冒泡排序是原地排序,不需要额外的空间!而且是稳定排序的算法,时间的复杂度最好为O(n),最坏为O(n2),平均为O(n2)。
2.选择排序
1.概念::第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
具体代码实现
public static void selectSort(){
int[] arr={3 44 38 5 47 15 36 26 27 2 46 4 19 50 48};
for(int i=0;i<arr.length-1;i++){//-1是因为没有必要进行最后一个数字的比较
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
swap(arr,i,j);//即用-即释放
}
}
}
show(arr);
}
2.选择排序是原地排序,不需要额外的空间!但是是不稳定排序的算法!时间的复杂度最好,最坏为,平均都为O(n2)
如果是序列5 8 5 2 9,第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。
3.公共的show方法 打印出来一个数组
public static void show(int[] arr){
String s="[";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i]+"]";
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
4.swap交换方法三种方法
public static void swap(int[] arr,int i,int j){
//1.借助三方变量进行交换
//适用于所有的数据类型 比较通用
/*
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
*/
//2.借助加减法运算进行交换
//只适用于数字相关的数据类型
arr[i]=arr[i]+arr[j];
arr[j]=arr[i]-arr[j];
arr[i]=arr[i]-arr[j];
//3.借助位运算进行交换
//只适用于整数相关的数据类型
/*
int a=3;
int b=7;
a=a^b;
0011
0111
0100
b=a^b;
0100
0111
0011 ->3
a=a^b;
0100
0011
0111 ->7
*/
}