冒泡排序,折半查找

------------------------------------冒泡排序------------------------------------

定义接口:抽象出排序数组中元素的不同状态(可否比较)

public interface SortInter {

	public <T extends Comparable<T>> void sort(T[] list);//T实例本身就是可以比较的
	
	public <T> void sort(T[] list,Comparator<T> com);//通过自定义比较器比较两个T
}

  

实现接口:具体实现排序方法

public class TestSort implements SortInter {

	@Override
	public <T extends Comparable<T>> void sort(T[] list) {
		boolean swapped = true;//根据上次排序有没有交换判断是否退出外层循环
		for (int i = 1,len = list.length; i < len && swapped; i++) {
			swapped = false;
			for (int j = 0; j < len - i; j++) {//每一次内层循环的循环次数都较前一次减一
				if(list[j].compareTo(list[j+1]) > 0) {
					T temp ;
					temp = list[j];
					list[j] = list[j+1];
					list[j+1] = temp;
					swapped = true;
				}
			}
		}
	}

	@Override
	public <T> void sort(T[] list, Comparator<T> com) {
		boolean swapped = true;
		for (int i = 1,len = list.length; i < len && swapped; i++) {
			for (int j = 0; j < len - i; j++) {
				if(com.compare(list[j], list[j+1]) > 0) {
					T temp ;
					temp = list[j];
					list[j] = list[j+1];
					list[j+1] = temp;
					swapped = true;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		Integer[] arr = {3,1,23,21,12,2,121,24};
		new TestSort().sort(arr);
		System.out.println(Arrays.toString(arr));
		String[] strArr = {"asd","as","Asf","Cbc","cxz","bca"};
		Comparator<String> com = new Comparator<String>() {
			@Override
			public int compare(String str1, String str2) {
				return str1.compareTo(str2);
			}
		};
		new TestSort().sort(strArr,com);
		for (int i = 0; i < strArr.length; i++) {
			System.out.println(strArr[i]+"\t");
		}
	}
}

控制台结果:

[1, 2, 3, 12, 21, 23, 24, 121]
Asf	
Cbc	
as	
asd	
bca	
cxz	

  

------------------------------------折半查找------------------------------------

package com.qf.test1;

public class TestSearch {

	/**
	 * 使用循环实现折半查找
	 * @param t
	 * @param key
	 * @return
	 */
	public static <T extends Comparable<T>> int binarySearch(T[] t , T key) {
		int low = 0;
		int high = t.length - 1;
		int mid ;
		while(low <= high) {
			mid = low + (high-low)/2;
			//不使用(low+high)/2是因为可能low+high的值溢出int范围无法计算;还可以使用右移>>1或者无符号右移>>>1
			if(t[mid].compareTo(key) > 0) {
				high = mid - 1;
			}else if(t[mid].compareTo(key) < 0){
				low = mid + 1;
			}else {
				return mid;
			}
		}
		return -1;
	}
	
	/**
	 * 使用递归实现折半查找
	 * @param t
	 * @param low
	 * @param high
	 * @param key
	 * @return
	 */
	public static <T extends Comparable<T>> int binarySearch(T[] t,int low,int high,T key) {
		if(low <= high) {
			int mid = low + (high-low)/2;
			if(t[mid].compareTo(key) > 0) {
				return binarySearch(t,low,mid-1,key);
			}else if(t[mid].compareTo(key) < 0) {
				return binarySearch(t,low,mid-1,key);
			}else {
				return mid;
			}
		}
		
		return -1;
	}
	
	public static void main(String[] args) {
		Integer[] arr = {1, 2, 3, 12, 21, 23, 24, 121};
		
		System.out.println("index:"+TestSearch.binarySearch(arr, 12));
	}
	
}

控制台打印

index:3

  

 

posted @ 2018-03-14 16:40  *青锋*  阅读(287)  评论(0编辑  收藏  举报