排序算法是很多公司面試或者筆試時候的必出題,也是會在自己今後道路上解決排序問題的重中之重。很多人在畢業後由於不怎麼接觸算法可能都忘記了。今天抽了點時間寫了部分常用排序算法的理解和實例,希望大家能喜歡!
話不多說 直接上代碼解釋吧
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]+" ");
}
}
}