快速排序_二分搜索
原創
快速排序:(以下引用來自百度百科:https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&fromid=2084344&fr=aladdin)
基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,
然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然后將所有 比它小的數都放到它前面,所有比它大的數都放到它后面,這個過程稱為一趟快速排序。值得注意的是,快速排序不 是一種穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時產生變動。 一趟快速排序的算法是: 1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1; 2)以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];3)從j開始向前搜索,即由后開始向前搜索(j--),找到第一個小于key的值A[j],將A[j]和A[i]互換;
4)從i開始向后搜索,即由前開始向后搜索(i++),找到第一個大于key的A[i],將A[i]和A[j]互換;
5)重復第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[i]不大于key
的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指針位置不變。 另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)。 二分查找:(以下引用來自百度百科:https://baike.baidu.com/item/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/10628618?fr=aladdin) 首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄 將表分成前、后兩個子表,如果中間位置記錄的關鍵字大于查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過 程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。 1 import java.util.*; 2 3 public class 二分搜索_快速排序 { 4 5 static int arr[]; 6 7 static int BinarySearch(int left,int right,int x){ //二分查找 8 int mid=0; 9 while(left<=right) { 10 mid=(left+right)/2; 11 if(x==arr[mid]) { 12 return mid; 13 } 14 else if(x<arr[mid]) { 15 right=mid-1; 16 } 17 else { 18 left=mid+1; 19 } 20 } 21 return -1; 22 } 23 24 static int YiKuan(int left,int right) { //一趟快速排序 25 int x=0; 26 x=arr[left]; //存儲基準記錄 27 while(left<right) { 28 while(left<right && arr[right]>x) { 29 right--; 30 } 31 if(left<right) { //判斷跳出條件是否合理 32 arr[left]=arr[right]; 33 left++; 34 } 35 while(left<right && arr[left]<x) { 36 left++; 37 } 38 if(left<right) { 39 arr[right]=arr[left]; 40 right--; 41 } 42 } 43 arr[left]=x; 44 return left; 45 } 46 47 static void Quan(int left,int right) { //快速排序 48 if(left<right) { 49 int mid=0; 50 mid=YiKuan(left,right); 51 Quan(left,mid-1); 52 Quan(mid+1,right); 53 } 54 } 55 56 public static void main(String args[]) { 57 58 Scanner reader=new Scanner(System.in); 59 System.out.print("輸入數組大小: "); 60 int n=0; 61 n=reader.nextInt(); 62 System.out.print("輸入數組元素: "); 63 arr=new int[n]; 64 for(int i=0;i<=n-1;i++) { 65 arr[i]=reader.nextInt(); 66 } 67 Quan(0,n-1); 68 System.out.println("快速排序之后: "); 69 for(int i=0;i<=n-1;i++) { 70 System.out.print(arr[i]+" "); 71 } 72 System.out.print("\n"); 73 System.out.print("請輸入您要查找的值: "); 74 int x=0; 75 x=reader.nextInt(); 76 int value=BinarySearch(0,n-1,x); 77 if(value!=-1) { 78 System.out.print("其索引為: "+value); 79 } 80 else { 81 System.out.println("the value not exist"); 82 } 83 } 84 }09:26:38
2018-06-18
轉載于:https://www.cnblogs.com/chiweiming/p/9188984.html
總結
- 上一篇: Debug实验学习汇编
- 下一篇: 不让复制是不可能的----js获取选中文