標籤:快速排序 java排序 置換 儲存 數量級 min 選擇排序 amp style
Java排序演算法(一)一、排序的基本概念和分類1.1排序的定義
在《大話資料結構》中,排序定義為,假設含有n個記錄的序列為{r1,r2,...,rn},其相應的關鍵字{k1,k2,...,kn},需確定1,2...n的一種排列p1,p2...pn,是其相應的關鍵字滿足Kp1<=Kp2<=...<=Kpn(非遞減或非遞增)關鍵,即使得序列稱為一個按關鍵字有序的序列{rp1,rp2...rp3},這樣的操作稱為排序。
1.2排序的穩定性
假設ki=kj(1<=i<=n,1<=j<=n,i!=j),且在排序前的序列中ri領先於rj(即i<j)。如果排序後ri仍然領先rj,則所用的排序方法是穩定的;反之, 若可能使得排序後序列中rj領先ri,則稱所用的排序方法是不穩定的。:
1.3內排序和外排序
內排序是在排序整個過程中,待排序的所有記錄全部被放置在記憶體中。
外排序是由於排序的記錄個數太多,不能同時放置在記憶體,整個排序過程需要內外多次交換資料才能進行
主要討論內排序,排序演算法效能主要受三方面影響
1.時間效能(儘可能少的關鍵字比較次數和儘可能少的記錄移動次數)
2.輔助空間(執行演算法所需要的其他儲存空間)
3.演算法複雜性(演算法本身的複雜度,不是演算法的時間複雜度)
1.4七個主要的排序演算法
按照演算法的複雜性(可以簡單理解為演算法邏輯和演算法編碼量)
簡單排序演算法:冒泡排序,簡單選擇排序,直接插入排序
改進演算法:快速排序,希爾排序,歸併排序,堆排序
二、簡單排序演算法
1 public class Sort 2 { 3 //實現從小到大排序 4 public static void main(String[] args) 5 { 6 int[] arr1 = {9,1,5,8,3,7,4,6,2}; 7 bubbleSort2(arr1); 8 //selectSort(arr1); 9 for(int i=0;i<arr1.length;i++)10 {11 System.out.println(arr1[i]);12 }13 }14 /*15 *冒泡排序,相鄰兩個元素進行比較,如果滿足條件進行位置置換16 *原理:本函數內迴圈一次,將最值提到冒泡到最尾部17 *備忘:各位大雕可以寫一個冒泡到數組頭部的,我寫冒泡到尾部代碼看起來比較好記,哈哈18 *時間複雜度:比較1+2+3+...+n=n*(n+1)/2次,並做等數量級的記錄移動O(n*n)19 */20 public static void bubbleSort1(int[] arr)21 {22 23 for(int i=0;i<arr.length-1;i++)24 {25 for(int j=0;j<arr.length-1-i;j++)26 {27 if(arr[j]>arr[j+1])28 {29 int temp = arr[j];30 arr[j] = arr[j+1];31 arr[j+1] = temp;32 }33 }34 }35 }36 /*37 *簡單選擇排序,以一個角標的元素和其他元素進行比較38 *原理,從n-1-i個記錄中選出關鍵字最小的記錄,並和第i個記錄交換39 *時間複雜度:O(n*n),相對而言,簡單選擇排序的效能要略優於冒泡排序40 */41 public static void selectSort(int[] arr)42 {43 for(int i=0;i<arr.length-1;i++)44 {45 int min = i; //將當前下標定義為最小值下標46 for(int j=i+1;j<arr.length;j++)47 {48 //j初始化為i,表示每次都是數組arr下標為i的元素和後面(i+1)的元素進行比較49 if(arr[min]>arr[j])50 {51 min = j; //如果有小於當前最小值的關鍵字,此關鍵字下標賦值給min52 }53 }54 if(i!=min) //如果min不等於i,說明找到最小值,交換55 {56 int temp = arr[i];57 arr[i] = arr[min];58 arr[min] = temp;59 }60 }61 }62 /*63 *直接插入排序,64 *原理:將一個記錄插入到已經排好序的有序表中,從而得到一個新的。記錄數增加1的有序表65 *例子:《大話資料結構》中將其比作抽撲克牌,抽一張排序一張,好書推薦。。。66 */67 public static void insertSort(int[] arr)68 {69 for(int i=1;i<arr.length;i++)70 {71 int temp = arr[i];72 for(int j=i;j>0&&temp<arr[j-1];j--)73 {74 arr[j]=arr[j-1];75 }
76 arr[j]=temp; 77 }78 }79 80 }
Java排序演算法(一)