若是有幸能看到java
排序:假設含有n個記錄的序列{R1,R2,R3..,Rn},其中的關鍵字序列爲{K1,K2,K3...,Kn}。將這些記錄從新排序爲{Ri1,Ri2,Ri3,Rin} ,使得相應的關鍵字知足Ki1<=Ki2<=..<=Kim,這樣的一種操做被稱爲排序。git
一般來講,排序的目的是快速查找github
衡量排序算法的優點:算法
排序算法分類:內部排序和外部排序編程
經常使用的內部排序api
選擇排序數組
交換排序數據結構
插入排序性能
基本原理:
將待排序的元素分爲已排序和未排序,依次將爲排序的元素中最小的元素放入已排序的組中,學習
直接排序簡單直觀,但性能略差:堆排序是一種較爲搞笑的選擇排序。但實現起來略爲複雜。
代碼實現:
import java.util.Arrays.*; //選擇排序, public class SelectSort{ public static void selectSort(int[] data) { int arrayLength = data.length; for (int i = 0; i < arrayLength - 1 ; i++ ) { for (int j= i +1; j < arrayLength; j++ ) { if (data[i] > data[j]) { swap(data,i,j); } } } System.out.println("排序後 " + java.util.Arrays.toString(data)); } //第一種經過臨時變量來完成交換 //注意這裏能夠用另一中一種方式 static void swap(int[] data,int i,int j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; } public static void main(String[] args) { int[] data = {3,4,2,6,8,1,9}; selectSort(data); } }
改進版的選擇排序:
//選擇排序算法 //選擇排序算法 //一、主要思想就是每次假設一個最小的值 public class SelectSort1 { public static void selectSort1(int[] data) { int arraylength = data.length; for (int i = 0; i < arraylength - 1; i++ ) { int minIndex = i; //每次假設一個最小值下標 for (int j = i + 1; j < arraylength ; j++ ) { if (data[minIndex] > data[j]) { minIndex = j; } } //判斷須要交換的下標是否爲本身 if (minIndex != i) { data[minIndex] = data[minIndex] + data[i]; date[i] = date[minIndex] - data[i]; data[minIndex] = data[minIndex] - data[i]; } } //輸出結果 for (int d :data ) { System.out.println("排序以後:" + d); } } public static void main(String[] args) { int[] data = {3,4,2,6,8,1,9}; selectSort1(data); } }
直接選擇排序效率分析
算法的時間效率:不管初始化狀態如何,在第i趟排序中選擇最小的元素,須要n-1次比較
算法的空間效率:空間效率較高,只須要一個附加程序單元用於交換,其空間效率爲O(1)
算法的穩定性:不穩定
資料和代碼來自這家,有一種感受,年代越遠,越重視基礎。如今的培訓呢?
堆排序就是把最大堆堆頂的最大數取出,將剩餘的堆繼續調整爲最大堆,再次將堆頂的最大數取出,這個過程持續到剩餘數只有一個時結束
這個有點難啊,下一個。回來再來看。
相鄰兩元素進行比較,若有須要則進行交換,每完成一次循環就將最大元素排在前面(從小到大排序)下一次循環是將其餘的數進行相似的比較。
代碼實現:
//冒泡排序 public class BubbleSort { static void sort(int[] data) { int len = data.length; for (int i = 0; i < len - 1; i++ ) { for (int j = 0 ; j < len - 1 - i; j++ ) { if (data[j] > data[j + 1]) { swap(data,j,j+1); } } } } static void swap(int[] data,int i,int j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; } public static void main(String[] args) { int[] data = {4,2,6,8,2,1,0}; sort(data); for(int d : data) { System.out.print("->" + d); } } }
冒泡排序效率分析:
快速排序(Quick Sorting)基本思想是:任取待排序序列中的某個元素爲界點,經過一次劃分,將待排序元素分爲左右兩個子序列,左子序列元素的排列序列均小於界點元素的排序碼,右子序列的排序碼則大於或等於界點的排序碼,而後分別對兩個字序列繼續進行劃分,直至每個序列只有一個元素爲止。
必定要認真啊,認真啊,認真啊!!!
代碼實現:
//快速排序 public class QuickSort { private static void swap(int[] data,int i,int j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; } private static void subSort(int[] data,int start,int end) { if (start < end) { int base = data[end]; int i = start; int j = end + 1; while(true) { while(i < end && data[++i] <= base) ; while(j > start && data[--j] >= base); if (i > j) { swap(data,i,j); }else { break; } } swap(data, start, j); subSort(data, start, j - 1); subSort(data, j + 1, end); } } public static void quickSort(int[] data) { subSort(data,0,data.length - 1); } public static void main(String[] args) { int[] data = {9,5,6,88}; quickSort(data); System.out.print(java.util.Arrays.toString(data)); } }
基本思想:每次將一個待排序的元素,按其關鍵字的大小插入到前面已經排好序的子序的合適位置,直到所有記錄插入完成。
* 插入算法. * 1,從後向前找到合適的位置插入 * 基本思想:每步將一個待排序的記錄,按其順序碼大小插入到前面已經排好的子序列的合適位置 * 直到所有插入爲止 */ public class InsertSort { public static void main(String[] args) { //待排序的數列 int[] nums = {43, 23, 64, 24, 34, 78, 32}; //控制比較的輪數 for (int i = 1; i < nums.length; i++) { //記錄操做數 int temp = nums[i]; int j = 0; for (j = i - 1; j >= 0; j--) { //後一個和前一個比較,若是前面的大,則把前面的賦值到後面。 if (nums[j] > temp) { nums[j+1] = nums[j]; } else { break; } } if (nums[j + 1] != temp) { nums[j + 1] = temp; } } //輸出結果 for(int n : nums) { System.out.println(n); } } }
直接插入排序:
直接插入排序 的基本思想:把n個待排序的元素堪稱爲一個有序表和無序表,開始時有序表中只包含一個元素,無序表中有n-1個元素,排序過程當中每次從無序表中取出第一個元素的排序碼進行比較,將它插入到有序表中的適當位置,使之成爲新的有序表。
代碼實現:
//直接插入排序 public class InsertSort { public static void insertSort(int[] data) { int arrayLength = data.length; for (int i = 1; i < arrayLength; i++) { int tmp = data[i]; if (data[i] < data[i -1]) { int j = i - 1; for (;j >=0 && data[j] > tmp; j-- ) { data[j + 1] = data[j]; } data[j + 1] = tmp; } } } public static void main(String[] args) { int[] data = {5,2,6,9}; insertSort(data); for (int d :data ) { System.out.print(" " + d); } } }
代碼實現:
//折半插入排序 public class BinaryInsertSort{ public static void binaryInsertSort(int[] data) { int len = data.length; for (int i = 1; i < len; i++) { int tmp = data[i]; int low = 0; int high = i - 1; while(low <= high) { int mid = (low + high) / 2; if (tmp > data[mid]) { low = mid + 1; } else { high = mid -1; } }for (int j = i;j > low ; j-- ) { data[j] = data[j - 1 ]; } data[low] = tmp; } } public static void main(String[] args) { int[] data = {5,2,7,3,9}; binaryInsertSort(data); for (int d : data) { System.out.print(" " + d); } } }
/** * Created by guo on 2018/2/2. * 二分查找法(折半查找):前提是在已經排好序的數組中,經過將待查找的元素 * 與中間索引值對應的元素進行比較,若大於中間索引值對應的元素,去右半邊查找, * 不然,去左邊查找。依次類推。直到找到位置;找不到返回一個負數 */ public class BinarySearchSort { public static void main(String[] args) { //必須保證數列是有序的 int[] nums = {12, 32, 55, 67, 87, 98}; int i = binarySearch(nums, 87); System.out.println("查找數的下標爲:" + i); //輸出下標爲4 } /** * 二分查找算法 * * @param nums * @param key * @return */ public static int binarySearch(int[] nums, int key) { int start = 0; //開始下標 int end = nums.length - 1; //結束下標 while (start <= end) { //開始位置不能穿過結束位置 --start-->|<--end-- int middle = (start + end) / 2; // 若是查找的key比中間的大,則去掉左邊的值 if (key > nums[middle]) { start = middle + 1; //若是查找的key比中間的小,則去掉右邊的。 } else if (key < nums[middle]) { end = middle - 1; //結束位置須要向前移一位。 } else { return middle; } } //找不到則返回-1 return -1; } }
先到這裏吧,後續還得多敲幾遍,須要學習的太多了,gogogo。