查找算法鞏固

二分查找又稱爲折半查找:

       僅適用於事先已經排好序的順序表。其查找的基本思路:首先將給定值K,與表中中間位置元素的關鍵字比較,若相等,返回該元素的存儲位置;若不等,這所需查找的元素只能在中間數據以外的前半部分或後半部分中。然後在縮小的範圍中繼續進行同樣的查找。如此反覆直到找到爲止。算法如下:


	//二分查找算法-折半查找
	public static int binarySearch(int[] arr,int des){
		int low = 0;
		int high = arr.length-1;
		while(low<=high){
			int mid = (low+high)>>>1;
			if(arr[mid]==des){
				return mid;
			}else if(arr[mid]<des){
				low = mid+1;
			}else if(arr[mid]>des){
				high = mid-1;
			}
		}
		return -1;
	}

快速排序算法:

1、算法思想
     快速排序是C.R.A.Hoare於1962年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其爲分治法(Divide-and-ConquerMethod)。

(1) 分治法的基本思想
     分治法的基本思想是:將原問題分解爲若干個規模更小但結構與原問題相似的子問題。遞歸地解這些子問題,然後將這些子問題的解組合爲原問題的解。

(2)快速排序的基本思想
     設當前待排序的無序區爲R[low..high],利用分治法可將快速排序的基本思想描述爲:
①分解: 
     在R[low..high]中任選一個記錄作爲基準(Pivot),以此基準將當前無序區劃分爲左、右兩個較小的子區間R[low..pivotpos-1)和R[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記爲pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。
  注意:
     劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示爲(注意pivot=R[pivotpos]):
     R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
                  其中low≤pivotpos≤high。
②求解: 
     通過遞歸調用快速排序對左、右子區間R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。

③組合: 
     因爲當"求解"步驟中的兩個遞歸調用結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

//快速排序
	public static void quickSort(int[] arr,int start,int end){
		if(start>end){
			return;
		}
		int index = arr[start];
		int i = start;
		int j = end;
		while(i<j){
			while(i<j&&arr[j]>index){//從右往左
				j--;
			}
			if(i<j)arr[i] = arr[j];
			while(i<j&&arr[i]<index){//從右往左
				i++;
			}
			if(i<j)arr[j] = arr[i];
			
			arr[i] = index;
		}
		quickSort(arr,start,i-1);
		quickSort(arr,i+1,end);
	}

 

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