版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25073789/article/details/79663362
排序是最基本的算法,理解各类排序的原理,效率,复杂度有助于开拓思维,对算法有一个简单的入门!
按平均复杂度来讲,冒泡,选择,插入的复杂度相同(On^2),也是最好理解最简单的排序方法,在生活中的应用也比较多。
选择排序是最直观,最简单的排序方法,一句话来概括:n个数里,找最小(大)的换到最前面,对n-1,n-2...2,1(除确认是最小(大)的以外的)依次找最小的交换。
public static void select_sort(int array[],int lenth){
for(int i=0;i<lenth-1;i++){
int minIndex = i;
for(int j=i+1;j<lenth;j++){
if(array[j]<array[minIndex]){
minIndex = j;
}
}
if(minIndex != i){
int temp = array[i];
array[i] = array[minIndex];
array[minIndex] = temp;
}
}
}
冒泡排序是改良版的选择排序,将选择排序找最小(大)交换到首位,改良成相邻的两个值比较然后将较大的交换到后面。如果序列基本有序 排序速度会大大优于选择排序,但如果是倒叙的话。。和选择排序效率一样(最常用,简单的)。
如果序列排好了 冒泡排序会继续下去,为了节省时间可以加状态码标识,如果没有发生交换就跳出(依然会多遍历一次)
public static void BubbleSort(int [] arr){
int temp;//临时变量
for(int i=0; i<arr.length-1; i++){ //表示趟数,一共arr.length-1次。
for(int j=arr.length-1; j>i; j--){
if(arr[j] < arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
}
插入排序 将值放到已有序数列的合适位置(一个数也可以看做有序),插入方法(将前一个有序数列长度增加,然后遍历交换),感觉本质是一样的。
public static void insert_sort(int array[],int lenth){
int temp;
for(int i=0;i<lenth-1;i++){
for(int j=i+1;j>0;j--){
if(array[j] < array[j-1]){
temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}else{ //不需要交换
break;
}
}
}
}
采用分治的思想进行排序
快速排序 快速排序效率优于上面三种,程序的执行效率很重要!!! 基本思想是:以第一个值为标识 比它小的放在它左侧,大的放右侧 再分别对两侧的执行相同步骤 直到标识两侧只有一个值。
public static void quickSort(int a[],int l,int r){
if(l>=r)
return;
int i = l; int j = r; int key = a[l];//选择第一个数为key
while(i<j){
while(i<j && a[j]>=key)//从右向左找第一个小于key的值
j--;
if(i<j){
a[i] = a[j];
i++;
}
while(i<j && a[i]<key)//从左向右找第一个大于key的值
i++;
if(i<j){
a[j] = a[i];
j--;
}
}
//i == j
a[i] = key;
quickSort(a, l, i-1);//递归调用
quickSort(a, i+1, r);//递归调用
}