栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java之查找与排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java之查找与排序

学习来源:https://blog.csdn.net/minfanphd/article/details/116974889

顺序查找与折半查找

1、顺序查找使用岗哨可以节约一半的时间. 为此, 第 0 个位置不可以放有意义的数据, 即有效数据只有 length - 1 个.
2、顺序查找时间复杂度为 O ( n ) O(n) O(n).
3、折半查找时间复杂度为 O ( log ⁡ n ) O(log n) O(logn).
4、书上为简化起见, 只关注键. 这里使用键值对来表示一条完整的数据. 实际应用中可以把 content 改成任何想要的数据类型.
5、加上上一节的代码,下面的代码只是增加了hash查找相关的功能函数。大部分代码仍然是上一节的代码,不用重复写,接着上一节的写就行.

package SearchAndSort;



public class DataArray {

	
	class DataNode{
		
		int key;
		
		
		String content;
		
		
		DataNode(int paraKey, String paraContent){
			key = paraKey;
			content = paraContent;
		}//Of the first constructor
		
		
		public String toString() {
			return "(" + key + " , " + content + ") ";
		}//Of toString
	}//of class DataNode
	
	
	DataNode[] data;
	
	
	int length;
	
	public DataArray(int[] paraKeyArray, String[] paraContentArray) {
		length = paraKeyArray.length;
		data = new DataNode[length];
		
		for(int i=0; i= 0 since data[0].key = paraKey.
		// In this way the runtime is saved about 1/2.
		// This for statement is equivalent to 
		//for (i = length - 1; data[i].key != paraKey; i--);
		for (i = length - 1; data[i].key != paraKey; i--) {
					;
			}//Of for i
		return data[i].content;
	}// Of sequentialSearch
	
	
	public static void sequentialSearchTest() {
		int[] tempUnsortedKeys = {-1, 5, 3, 6, 10, 7, 1, 9};
		String[] tempContents = {"null", "if", "then", "else", "switch", "case", "for", "while"};
		DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);
			
		System.out.println(tempDataArray);
		System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(10));
		System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(5));
		System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(4));
	}// Of sequentialSearchTest
	
	
	public String binarySearch(int paraKey) {
		int tempLeft = 0;
		int tempRight = length - 1;
		int tempMiddle = (tempLeft + tempRight) / 2;
		
		while(tempLeft <= tempRight) {
			tempMiddle = (tempLeft + tempRight) / 2;
			if(data[tempMiddle].key == paraKey) {
				return data[tempMiddle].content;
			}else if(data[tempMiddle].key <= paraKey) {
				tempLeft = tempMiddle + 1;
			}else {
				tempRight = tempMiddel - 1;
			}//Of if
		}//Of while
		
		//Not found.
		return "null";
	}//Of binarySearch
	
	
	public static void binarySearchTest() {
		int[] tempSortedKeys = { 1, 3, 5, 6, 7, 9, 10 };
		String[] tempContents = { "if", "then", "else", "switch", "case", "for", "while" };
		DataArray tempDataArray = new DataArray(tempSortedKeys, tempContents);

		System.out.println(tempDataArray);
		
		System.out.println("Search result of 10 is: " + tempDataArray.binarySearch(10));
		System.out.println("Search result of 10 is: " + tempDataArray.binarySearch(5));
		System.out.println("Search result of 10 is: " + tempDataArray.binarySearch(4));
	}// Of binarySearchTest
	
	
	
	public static void main(String[] args) {
		System.out.println("rn-------sequentialSearchTest-------");
		sequentialSearchTest();
		
		System.out.println("rn-------binarySearchTest-------");
		binarySearchTest();
	}//Of main

}//Of class DataArray

哈希表

1、神奇、实用、粗暴的方法. 空间换时间.
2、保证空间足够.
3、在构造方法中装入数据. 自己可以写代码增加数据.
4、使用 (最简单的) 除数取余法获得数据存放地址 (下标).
5、使用 (最简单的) 顺移位置法解决冲突.
6、搜索的时间复杂度仅与冲突概率相关, 间接地就与装填因子相关. 如果空间很多, 可以看出时间复杂度为 O ( 1 ) 。

package SearchAndSort;



public class DataArray {

	
	class DataNode{
		
		int key;
		
		
		String content;
		
		
		DataNode(int paraKey, String paraContent){
			key = paraKey;
			content = paraContent;
		}//Of the first constructor
		
		
		public String toString() {
			return "(" + key + " , " + content + ") ";
		}//Of toString
	}//of class DataNode
	
	
	DataNode[] data;
	
	
	int length;
	
	public DataArray(int[] paraKeyArray, String[] paraContentArray) {
		length = paraKeyArray.length;
		data = new DataNode[length];
		
		for(int i=0; i= 0 since data[0].key = paraKey.
		// In this way the runtime is saved about 1/2.
		// This for statement is equivalent to 
		//for (i = length - 1; data[i].key != paraKey; i--);
		for (i = length - 1; data[i].key != paraKey; i--) {
					;
			}//Of for i
		return data[i].content;
	}// Of sequentialSearch
	
	
	public static void sequentialSearchTest() {
		int[] tempUnsortedKeys = {-1, 5, 3, 6, 10, 7, 1, 9};
		String[] tempContents = {"null", "if", "then", "else", "switch", "case", "for", "while"};
		DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents);
			
		System.out.println(tempDataArray);
		System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(10));
		System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(5));
		System.out.println("Search result of 10 is: " + tempDataArray.sequentialSearch(4));
	}// Of sequentialSearchTest
	
	
	public String binarySearch(int paraKey) {
		int tempLeft = 0;
		int tempRight = length - 1;
		int tempMiddle = (tempLeft + tempRight) / 2;
		
		while(tempLeft <= tempRight) {
			tempMiddle = (tempLeft + tempRight) / 2;
			if(data[tempMiddle].key == paraKey) {
				return data[tempMiddle].content;
			}else if(data[tempMiddle].key <= paraKey) {
				tempLeft = tempMiddle + 1;
			}else {
				tempRight = tempMiddel - 1;
			}//Of if
		}//Of while
		
		//Not found.
		return "null";
	}//Of binarySearch
	
	
	public static void binarySearchTest() {
		int[] tempSortedKeys = { 1, 3, 5, 6, 7, 9, 10 };
		String[] tempContents = { "if", "then", "else", "switch", "case", "for", "while" };
		DataArray tempDataArray = new DataArray(tempSortedKeys, tempContents);

		System.out.println(tempDataArray);
		
		System.out.println("Search result of 10 is: " + tempDataArray.binarySearch(10));
		System.out.println("Search result of 10 is: " + tempDataArray.binarySearch(5));
		System.out.println("Search result of 10 is: " + tempDataArray.binarySearch(4));
	}// Of binarySearchTest
	
	
	public DataArray(int[] paraKeyArray, String[] paraContentArray, int paraLength) {
		//Step 1. Initialize.
		length = paraLength;
		data = new DataNode[length];
		
		for(int i=0; i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/821055.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号