Java小白的成長(山丘篇)之排序

咋們今天來聊一聊比較常見的排序,選擇,冒泡,計數,插入

選擇排序

核心思想:當前元素和之後所有元素進行比較,如果當前大於後者,則進行交換

咋們來一個動圖,就可以更加直觀的瞭解了

算法步驟 :

1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2.再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。

3.重複第二步,直到所有元素均排序完畢。

代碼演示:

class 排序{
    public static void mian(String[] args){
       int[] S=new int[10];
        for(int i=0;i<S.length-1;i++){
            for(int j=i+1;j<S.length;j++){
                if(S[i]>S[j]){
                    int temp = S[i];
                    S[i]=S[j];
                    S[j]=temp;
                }
            }
        }
        show(S);
    }
   
    public static void show(int[] S){
       String s="[";
       for(int i=0;i<S.length;i++){
           if(i==S.length-1){
               s+=S[i]+"]";
           }else{
               s+=S[i]+",";
           }
       }
       System.out.println(s);
    }
}

冒泡排序

對於冒泡排序,我想大家想必不陌生,他是兩兩進行比較,大的一直往下沉(這裏默認的情況是從小到大)

圖解

算法 步驟:

1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

3.針對所有的元素重複以上的步驟,除了最後一個。

4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

代碼演示

class 冒泡{
    public static void main(String[] args){
    	bubbleSort();
  	}
	 public static void bubbleSort(){
        int[] arr={8,5,9,2,7,4,6,1,3};
        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);
    }
    public static void show(int[] arr){
        //[1,2,3,4,5,6,7,8,9]
        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);
    }
}

注意選擇排序與冒泡排序的區別:冒泡排序通過依次交換相鄰兩個順序不合法的元素位置,從而將當前最小(大)元素放到合適的位置;而選擇排序每遍歷一次都記住了當前最小(大)元素的位置,最後僅需一次交換操作即可將其放到合適的位置。

插入排序

通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。

算法步驟:

1.將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最後一個元素當成是未排序序列。

2.從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當位置。(如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。)

代碼演示:

import java.util.Arrays;
public class Test {
public static void main(String[] args) {
	int[] array={12,73,45,69,35};
	int i,j,temp;
	for(i=1;i<array.length;i++) {
		/*
		 * 第一個for循環
		 * 把數組分成兩部分,右邊爲未排序,左邊爲已排序
		 * 記錄排序與未排序分割點temp(temp爲下一個排序對象)
		 */
	        temp=array[i];
		for(j=i-1;j>=0;j--) {
		/*
		 * 第二個for循環
		 * 將排序對象temp與已排序數組比較
		 * 當temp比最近左邊的數大時(按從小到大循序排列時)
		* 直接結束本次循環,進行下一個數排序
		 * 否則比左邊這個數小時將這個數後移,騰出這個數的位置
		 */
		   if (temp > array[j]) {
			break;
		   }else{
	    	   array[j+1] = array[j];
	       }
		}
		array[j+1]=temp;
	}
	System.out.println(Arrays.toString(array));
}
} 

計數排序

先找出最大值最小值,之後統計每個數出現的次數,根據次數從小到大往數組裏添加。它適用於當前數組密集的情況。

計數排序不是基於比較的排序算法,其核心在於將輸入的數據值轉化爲鍵存儲在額外開闢的數組空間中。 作爲一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有確定範圍的整數。

算法步驟:

1.找出待排序的數組中最大和最小的元素;
2.統計數組中每個值爲i的元素出現的次數,存入數組C的第i項;
3.對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
4.反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1.

代碼演練

 //計數排序
 public static void CountSort(int *a, int size){
     int max = a[0];
    int min = a[0];
    for (int i = 0; i < size; ++i)
      {
          if (a[i] > max)
              max = a[i];
         if (a[i] < min)
             min = a[i];
     }
     int range = max - min + 1; //要開闢的數組範圍
     int *count = new int[range];
     memset(count, 0, sizeof(int) * range); //初始化爲0
                                           //統計每個數出現的次數
    for (int i = 0; i < size; ++i)           //從原數組中取數,原數組個數爲size
     {
         count[a[i] - min]++;
     }
     //寫回到原數組
     int index = 0;
     for (int i = 0; i < range; ++i) //從開闢的數組中讀取,開闢的數組大小爲range
     {
         while (count[i]--)
         {
            a[index++] = i + min;
         }
     }
     delete[] count;
 }

排序還有好多,另外再見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章