數據結構(Java)——查找和排序(1)

1.查找的定義

    查找是這樣一個過程,即在某個項目組中尋找某一指定目標元素,或者確定該組中并不存在該目標元素。 對其進行查找的項目的組有時也成為查找池。兩種常見的查找方式:線性查找和二分查找。為了能夠查找某一對象,我們就必須將一個對象跟另一個對象進行比較。我們對這些算法的實現就是對某個Comparable對象的數組進行查找。因此,所涉及的元素實現了Comparable接口且彼此是可比較的。我們將在Searching類頭中完成這一限制。

2.算法查找

2.1 線性查找

/*** 線性查找 在沒有找到之前 需要一直遍歷* * @param data* @param min* @param max* @param target* @return*/public static <T extends Comparable<T>> boolean linearSearch(T[] data,int min, int max, T target) {int index = min;boolean found = false;while (!found && index <= max) {found = data[index].equals(target);index++;}return false;}

2.2 二分查找

/*** 二分查找:二分查找需要實現數組列表有序,然后每次考察中間元素,排除一半,最好的方法是使用遞歸實現。* @param data* @param min* @param max* @param target* @return* * 二分查找方法是遞歸實現的,如果沒有找到目標元素,且有更多待查找數據,則該方法將調用自身,同時傳遞參數,* 這些參數縮減了數組內可行候選項的規模。* * min和max索引用于確定是否還具有更多的待查找數據,這就是說,如果削減后的查找區間一個元素沒有則該方法* 不會調用其自身且返回一個false值。* * * */public static <T extends Comparable<? super T>> boolean binarySearch(T[] data, int min, int max, T target) {boolean flag= false;int mid = (max+min)/2;if(data[mid].compareTo(target)==0){flag = true;}else if(data[mid].compareTo(target)>0){//中間大于目標if(min<=mid-1){flag = binarySearch(data, min, mid-1, target);}}else if(data[mid].compareTo(target)<0){if(mid+1<=max){flag = binarySearch(data, mid+1, max, target);}}return flag;}

2.3 查找比較
線性查找,最好情形是目標元素剛好是我們考察項目組的第一個項目。最糟糕的情形是出現在目標不再該組的時候,且在我們確定它不在之前不得不考察每一個元素。算法的期望是n/2,因此線性查找算法具有線性時間復雜度O(n)。
二分查找,因為我們每比較一回我們就能夠將剩余數據削減一半,所以我們可以更快的找到元素。最好的情況一次找到,最差是排除所有元素,我們不得不進行log2n 次比較。因此,找到位于該查找池中某一元素的預期情形是大約(log2n)/2次比較。

線性查找比較簡單,編程調試更容易實現。
線性查找無需花費額外成本來排序該查找列表。
二分查找的復雜度是對數級的,這使得它對于大型查找池非常有效率。

3.排序簡介

排序:基于某一個標準,將某一組項目按照某個規定順序排列。
基于效率排序算法通常分為兩類:順序排序和對數排序。
順序排序:它通常使用一對嵌套循環對n個元素進行排序,需要大約n2 次比較。
對數排序:它對n個元素進行排序大約需要nlog2n 次比較。
在n較小的時候,這兩類算法之間幾乎不存在任何實際差別。

4.泛型:補充資料

package ds.java.ch09;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** @author LbZhang* @version 創建時間:2015年11月19日 上午11:16:20* @description 類說明* * 綜合分析:* extends 可用于的返回類型限定,不能用于參數類型限定。* super 可用于參數類型限定,不能用于返回類型限定。* * 帶有super超類型限定的通配符可以向泛型對易用寫入,帶有extends子類型限定的通配符可以向泛型對象讀取.*/
public class Genertic {public static void main(String[] args) {/*** List<? extends Frut> 表示 “具有任何從Fruit繼承類型的列表”,編譯器無法確定List所持有的類型,* 所以無法安全的向其中添加對象。可以添加null,因為null 可以表示任何類型。所以List 的add 方法不能* 添加任何有意義的元素,但是可以接受現有的子類型List<Apple> 賦值。*/List<? extends Fruit> felist = new ArrayList<Apple>();//flist.add(new Apple());Fruit f = felist.get(0);/*** List<? super Fruit> 表示“具有任何Fruit超類型的列表”,列表的類型至少是一個 Fruit 類型,* 因此可以安全的向其中添加Fruit 及其子類型。由于List<? super Fruit>中的類型可能是任何Fruit* 的超類型,無法賦值為Fruit的子類型Apple的List<Apple>.* */List<? super Fruit> fslist = new ArrayList<Fruit>();fslist.add(new Apple());//Fruit fs = fslist.get(0);}}class Food {
}class Fruit extends Food {
}class Apple extends Fruit {
}class RedApple extends Apple {
}

總結:
extends 可用于的返回類型限定,不能用于參數類型限定。
super 可用于參數類型限定,不能用于返回類型限定。

帶有super超類型限定的通配符可以向泛型對易用寫入,帶有extends子類型限定的通配符可以向泛型對象讀取。——《Core Java》

轉載于:https://www.cnblogs.com/mrzhang123/p/5365832.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GetProcAddress()用法

函數功能描述: GetProcAddress()函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。 函數原型&#xff1a; FARPROC GetProcAddress( HMODULE hModule, // DLL模塊句柄 LPCSTR lpProcName // 函數名 ); 參數&#xff1a; hModule [in] 包含此函數的…

支付寶問題LaunchServices: ERROR: There is no registered handler for URL scheme alipay

LaunchServices: ERROR: There is no registered handler for URL scheme alipay &#xff08;這句話其實是在告訴你 設備上沒有安裝 支付寶的客戶端,此時會走網頁端&#xff09;而有人會發現并沒有HTML5網頁彈出過一會&#xff0c;會發現服務器返回4000支付失敗&#xff0c;這…

C++string類常用函數 c++中的string常用函數用法總結

string類的構造函數&#xff1a; string(const char *s); //用c字符串s初始化 string(int n,char c); //用n個字符c初始化 此外&#xff0c;string類還支持默認構造函數和復制構造函數&#xff0c;如string s1&#xff1b;string s2"hello"&#xff1b;都是正…

排列與組合

話說&#xff0c;初一的時候看到這樣一道題&#xff1a;有一種彩票中獎率為1%&#xff0c;買一百張是不是一定能中獎&#xff1f;答案自然是否定的&#xff0c;但我在想&#xff0c;如果有200張彩票&#xff0c;兩張有獎&#xff0c;買一百張中獎率是多少&#xff1f;一天晚上睡…

剔除服務器返回的NSNull格式的數據

服務器返回NSNull格式的數據&#xff0c;真。。的煩人 解決辦法&#xff1a;在AFN請求里面加上下面兩段代碼&#xff0c;OK AFJSONResponseSerializer *response (AFJSONResponseSerializer *)manager.responseSerializer; response.removesKeysWithNullValues YES;

顯式(靜態)調用: LIB + DLL + .H

1、編程時用ad.h,ad.lib,放在項目當前目錄里2、在頭文件中加入#include "ad.h"3、在Project Setting–>Link–>Object/library modules加入ad.lib執行時將ad.dll跟你的程序放在同一目錄。 就可以直接調用dll中的函數了 當前目錄 轉載于:https://www.cnblogs.co…

boost Mutex

寫過多線程程序的人都知道&#xff0c;不能讓多個線程同時訪問共享的資源是至關重要的。 假如一個線程試圖改變共享數據的值&#xff0c;而另外一個線程試圖去讀取該共享數據的值&#xff0c;結果將是未定義的。 為了阻止這樣的事情發生&#xff0c;需要用到一些非凡的原始數據…

接入支付寶出現交易訂單處理失敗,請稍后再試(ALI64)的錯誤

上次在接入支付寶的時候就碰到了交易訂單處理失敗&#xff0c;請稍后再試&#xff08;ALI64&#xff09;這樣的錯誤&#xff0c;后來經過排查和總結&#xff0c;一般來講這種問題都是公鑰和私鑰沒有正確配置造成的。支付寶這邊為了保證數據在傳輸時不被篡改&#xff0c;使用了r…

c中session的用法

c中session的用法你知道嗎&#xff1f;下面小編就跟你們詳細介紹下c中session的用法&#xff0c;希望對你們有用。c中session的用法如下&#xff1a;Session的基本屬性&#xff1a;一、屬性1、SessionIDSessionID 屬性返回用戶的會話標識。在創建會話時&#xff0c;服務器會為每…

查看硬件信息

測試機器的硬件信息&#xff1a; 查看CPU信息&#xff08;型號&#xff09; # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 8 Intel(R) Xeon(R) CPU E5410 2.33GHz (看到有8個邏輯CPU, 也知道了CPU型號) # cat /proc/cpuinfo | grep physical …

支付寶集成交互流程

交互流程 功能流程 流程說明&#xff08;以Android平臺為例&#xff09;&#xff1a; 第4步&#xff1a;調用支付接口&#xff1a;此消息就是本接口所描述的開發包提供的支付對象PayTask&#xff0c;將商戶簽名后的訂單信息傳進pay方法喚起支付寶收銀臺&#xff0c;訂單格式具體…

VxLAN基礎

轉自&#xff1a;http://blog.csdn.net/freezgw1985/article/details/16354897 一 . 為什么需要Vxlan1. vlan的數量限制4096個vlan遠不能滿足大規模云計算數據中心的需求2. 物理網絡基礎設施的限制基于IP子網的區域劃分限制了需要二層網絡連通性的應用負載的部署3. TOR交換機MA…

find_first_of()和 find_last_of() 【獲取路徑、文件名】

string 類提供字符串處理函數&#xff0c;利用這些函數&#xff0c;程序員可以在字符串內查找字符&#xff0c;提取連續字符序列(稱為子串)&#xff0c;以及在字符串中刪除和添加。我們將介紹一些主要函數。 1.函數find_first_of()和 find_last_of() 執行簡單的模式匹配&#x…

支付寶集成

memo Error Domain系統繁忙&#xff0c;請稍后再試 Code1000 "(null)" reslut {memo "Error Domain\U7cfb\U7edf\U7e41\U5fd9\Uff0c\U8bf7\U7a0d\U540e\U518d\U8bd5 Code1000 \"(null)\"";result "";resultStatus 4000;} 請問安裝…

servlet中實現頁面跳轉return “r:”和return “f:

servlet中實現頁面跳轉return “r&#xff1a;”和return “f&#xff1a;”的區別和作用 分享| 2015-07-28 14:22741830480 | 瀏覽 48 次Pascal2015-07-28 14:26 #知道行家專業創造價值&#xff0c;火熱招募中&#xff01;#提問者采納熱心網友r是redirect重定向&#xff0c;參…

多線程編程 RW_LOCK 讀寫鎖

RW鎖 讀寫鎖&#xff0c;也叫共享獨占鎖 互斥量 要么是鎖住狀態&#xff0c;要么是不加鎖狀態&#xff0c;而且一次只有一個線程可以對其加鎖。 讀寫鎖可以有三種狀態&#xff0c;讀模式下加鎖狀態&#xff0c;寫模式下加鎖狀態&#xff0c;不加鎖狀態。一次只有一個線程可以占…

Error Domain=NSCocoaErrorDomain Code=3840 JSON text did not start with array or object and option

數據請求失敗 報錯 Error DomainNSCocoaErrorDomain Code3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo{NSDebugDescriptionJSON text did not start with array or object and option to allow fragm…

vim學習筆記(4)幫助與配置

使用幫助 在Vim中輸入命令&#xff1a;help&#xff0c;即可進入幫助界面&#xff0c;默認是英文&#xff0c;可以通過以下方式安裝中文幫助&#xff08;以vimcdoc-1.9.0為例&#xff09;&#xff1a; 1、下載中文幫助的文件壓縮包 2、解壓 tar -xzvf vimcdoc-1.9.0.tar.gz 3、…

C語言程序代碼優化

我認為一個好的用于科學計算的程序代碼應該&#xff1a;算法漂亮精妙&#xff0c;程序簡潔易懂&#xff0c;運算快速&#xff0c;節省內存。這里有的地方是矛盾的&#xff0c;比如簡潔vs易懂&#xff0c;時間vs空間&#xff0c;找個平衡吧。目前來看時間要比空間寶貴一些。寫程…

微信支付不回調支付成功的方法,這是為什么

如果你是Xcode7.2&#xff0c;或者IOS9.2的話&#xff0c;可能會遇見在微信客戶端操作返回程序之后不能執行微信的onResp回調方法的問題&#xff0c;就是因為一下這兩個方法被廢棄掉了&#xff0c;所以我的新demo替換了一個新的方法在下面。就完美解決這個問題了&#xff08;并…