快速排序_二分搜索
原创
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是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