排序算法是很多公司面试或者笔试时候的必出题,也是会在自己今后道路上解决排序问题的重中之重。很多人在毕业后由于不怎么接触算法可能都忘记了。今天抽了点时间写了部分常用排序算法的理解和实例,希望大家能喜欢! 话不多说 直接上代码解释吧
public class SortArray {
/***
* 冒泡排序 n个人
*@description a[0]-a[n-1]比较: 从a[0] 和a[1] 开始比较 如果a[0]>a[1] 则a[0]和a[1]位置互换 再比较a[1]和a[2]
* ....最后比较a[n-2]和a[n-1] 这样一轮下来a[n-1] 一定是这数组中最大的 。再对a[0]-a[n-2]同样方法排序....
* @param array
* 时间复杂度 从前依次往后比较次数分别为(n-1)+(n-2)+....+1 =n*(n-1)/2 O(n2)
* 空间复杂度 一个数组 n 也就是O(1)
* 稳定性 : 稳定
*/
public static void BubbleSort(int[] array){
//从前往后第一个开始
// for(int i=0;i<array.length-1;i++){
// for(int j=0;j<array.length-i-1;j++){
// int temp=0;
// if(array[j]>array[j+1]){
// temp =array[j];
// array[j]=array[j+1];
// array[j+1]=temp;
// }
// }
// }
//从后往前 第a[n-1] 和a[n-2] 比较 若a[n-1]>a[n-2] 则交换位置 a[n-2]和a[n-2]同理,知道a[1]和a[0] 第一轮比较结束 ;
//第二轮从第a[n-1]-a[1] 依旧
//每i轮a[i-1] 一定是这组数中最小的值
for(int i=0;i<array.length;i++){//第i+1次排序
for(int j=array.length-1;j>i;j--){ //每i轮排序从a[i-1] -a[array.length-1]开始
if(array[j]<array[j-1]){
int temp =array[j-1];
array[j-1]=array[j];
array[j]=temp;
}
}
}
}
/***
* 选择排序
* @author :yuzg
* @Description:已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。
* 首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],依此类推,最后比较a[1]与a[n]的值。
* 这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。
* 再将a[3]与a[4]~a[n]以相同方法比较一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。 注:a[1] 相当于第一个数array[0]
* @param array
* 思路:每一轮先找到数组中最小值的下标 然后和当前的还没排好序的第一个换
*/
public static void selectionSort(int[] array){
if(array.length<2){
return;
}
for(int i=0;i<array.length;i++){
int min_index=Integer.MIN_VALUE;
for(int j=i+1;j<array.length;j++){
if(array[i]>array[j]){
min_index=j;
}else{
min_index=i;
}
}
if(min_index !=i){
int temp=array[i];
array[i]=array[min_index];
array[min_index]=temp;
}
}
}
/***
* 插入排序
* @author :yuzg 共n个元素
* @Description:从第二个数字开始和前面的进行比较。找到合适的插入位置ax处(就像我们平常抓牌 ,抓下一张牌后,会把这张牌依次与左手上的牌比较)
* 从i-1->x 依次往后退一位,ai 移到x处
* @param array
* 时间复杂度:从前往后:1+2+3+(n-1) =O(n2)
* 空间复杂度 O(1)
* 优点:稳定,快;
缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
*/
public static void insertSort(int[] array){
int i,j;
for( i=1;i<array.length;i++){ //从a[1](第二个元素)开始 查找前面需要插入的地方
// for(j=i-1;j>=0&&array[i]<array[j];j--){//找到x(要插入的下标) 即j最后的值
//
// } //上面的for 等价于:
for(j=i-1;j>=0;){//找到x(要插入的下标) 即j最后的值
if(array[i]>=array[j]){
break;
}else{ //即array[i]<array[j]
j--;
}
}
//此地注意 因为满足array[i]<array[j] 后还要j-- 所以此时 ai 应该插入到aj后面一位
//从i-1->x都往后移动一位
int temp =array[i];
for(int k=i;k>j;k--){
array[k]=array[k-1];
}
array[j+1]=temp;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array={1,3,2,45,6,8,7};
// BubbleSort(array);
// selectionSort(array);
insertSort(array);
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
}