日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法-排序与查找(java描述)

發(fā)布時(shí)間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法-排序与查找(java描述) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在軟件開(kāi)發(fā)中,有兩個(gè)常見(jiàn)的任務(wù),一個(gè)是某一組中查找某個(gè)特定的元素,另一個(gè)是將某一組元素按照特定的順序排序。我們可以使用多種算法來(lái)完成這些任務(wù),而這些算法的差異也是值得我們?nèi)プ屑?xì)研究的,接下來(lái)我們探究一下這些算法。


一、查找

1.1、線性查找法
線性查找就是通過(guò)索引對(duì)數(shù)組data的每個(gè)元素進(jìn)行遍歷,如果發(fā)現(xiàn)要找的目標(biāo)元素和數(shù)組data中的某個(gè)元素相同時(shí),就返回已經(jīng)查找到,當(dāng)然,我們也是可以改進(jìn)一下,就是直接把找到的元素返回即可。

public static <T extends Comparable<? super T>> boolean linearSearch(T[] data, int min , it max, T target) {int index = min;boolean found = false;while(!found && index <= max){//判斷界限if(data[index].compareTo(target) == 0){found = true;}index++;}return found; }

1.2、二分查找法
二分查找法的效率比線性搜索法高,因?yàn)椴挥萌勘闅v一遍,節(jié)省了很多的時(shí)間,這里我們采用的方法是遞歸調(diào)用來(lái)進(jìn)行查找的,如果發(fā)現(xiàn)中點(diǎn)位置的元素大小小于目標(biāo)元素,就將中點(diǎn)位置的索引+1,進(jìn)行遞歸調(diào)用,如果大于目標(biāo)元素,就將中點(diǎn)位置索引-1,進(jìn)行遞歸調(diào)用,而遞歸的出口就是,當(dāng)中點(diǎn)位置的值和目標(biāo)元素的值相等時(shí),則返回結(jié)果。

public static <T extends Comparable<? super T>> boolean binarySearch(T[] data, int min , it max, T target) {boolean found = false;int midpoint = (min+max)/2;//選擇中點(diǎn)位置if(data[midpoint].compareTo(target) == 0){found = true;} else if(data[midpoint].compareTo(target) > 0){if(min <= midpoint - 1){found = binarySearch(data, min, midpoint - 1, target);}} else if(data[midpoint].compareTo(target) > 0){if(max >= midpoint + 1){found = binarySearch(data, min, midpoint + 1, target);} }

二、排序

排序分為
順序排序:選擇,插入,冒泡排序;
對(duì)數(shù)排序:快速,歸并排序;

2.1、選擇排序
通過(guò)掃描整個(gè)列表找出最小值,將這個(gè)值與該列表的第一個(gè)位置的值交換。掃描剩余(除了第一個(gè)值)部分列表并找出最小值,然后將它和該列表的第二個(gè)位置處的值交換。以此類推下去。

public static <T extends Comparable<? super T>> void selectionSort(T[] data){int min ;//定義存儲(chǔ)掃描的最小值T temp;for(itn index = 0; index < data.length - 1; index++){min = index;//初始化為最小值為第一個(gè)for(int scan = index + 1; scan < data.length - 1; scan++){if(data[scan].compareTo(data[min]) < 0){//如果小于最小值,就將找到的最小值賦值給當(dāng)前的最小值min = scan;}}//將找到的最小值和當(dāng)前的第一個(gè)位置交換temp = data[min];data[min] = data[index];data[index] = temp;} }

外層循環(huán)控制下一個(gè)最小值將保存在數(shù)組中的哪個(gè)位置,內(nèi)層循環(huán)通過(guò)掃描所有大于或者等于外層循環(huán)制定索引的位置來(lái)查找剩余部分的列表的最小值。

這里提取一個(gè)互換的函數(shù)

//兩個(gè)元素交換位置 private static <T extends Comparable<T>> void swap (T[] data, int index1, int index2){T temp = data[index];data[index1] = data[index2];data[index2] = temp; }

2.2、插入排序
插入排序算法通過(guò)反復(fù)的將某個(gè)特定的值插入到該列表某個(gè)已排序的子集中來(lái)完成對(duì)列表值得排序。
策略:將列表中的頭兩個(gè)值依據(jù)其相對(duì)大小對(duì)其進(jìn)行排序,將列表的第三個(gè)值插入到頭兩個(gè)已排序的值中的恰當(dāng)位置,然后將第四個(gè)值插入到前三個(gè)已排序的恰當(dāng)位置。

public static <T extends Comparable<? super T>> void selectionSort(T[] data){for(int index = 1; index < data.length; index++){T key = data[index];//將這個(gè)元素暫時(shí)保存int position = index;//外層循環(huán)保存索引//查找更大的元素到對(duì)的位置while(position > 0 && data[position - 1].compareTo(key) > 0){data[position] = data[position - 1];position --;}data[position] = key;} }

2.3、冒泡排序
重復(fù)的比較列表中的相鄰的元素,如果發(fā)現(xiàn)某個(gè)相鄰的元素的位置不對(duì)的時(shí)候,就將這兩個(gè)元素的位置交換。

public static <T extends Comparable<? super T>> void selectionSort(T[] data){int position ,scan;T temp;for(position = data.length - 1; position >=0; position --){for(scan = 0; scan <= position - 1; scan++){if(data[scan].compareTo(data[scan+1]) > 0){swap(data,scan, scan + 1);}}} }

2.4、快速排序
通過(guò)任意選定的分區(qū)元素將該列表分區(qū),然后對(duì)分區(qū)元素的任一邊的子列表進(jìn)行遞歸排序。

public static <T extends Comparable<T>> void quickSort(T[] data){quickSort(data, 0, data.length-1); }public static <T extends Comparable<T>> void quickSort(T[] data, min , max){if(min < max){//創(chuàng)建分區(qū)索引int indexOfPartition = partition(data, min, max);//對(duì)左分區(qū)進(jìn)行遞歸排序quickSort(data, min, indexOfPartition -1);//對(duì)右分區(qū)進(jìn)行遞歸排序quickSort(data, indexOfPartition + 1, max);} }public static <T extends Comparable<T>> void partition(T[] data, int min , int max){T partitionelement;int left, right;int middle = (min+max)/2;//使用中間數(shù)據(jù)值作為分區(qū)元素partitionelement = data[middle];//將第一個(gè)元素和分區(qū)元素交換位置swap(data,middle,min);left = min;right = max;while(left < right){//如果左邊的元素比分區(qū)元素小就索引右移查找下一個(gè)while(left< right && data[left].compareTo(partitionelement) <= 0){left ++;}//如果右邊元素比分區(qū)元素大就索引左移查找下一個(gè)元素while(data[right].compareTo(partitionelement) > 0){right ++;}if(left < right){swap(data,left,right);}}//將分區(qū)元素放回到原來(lái)的位置swap(data, min, right);return right; }

2.5、歸并排序

將列表分成大約相等的兩個(gè)部分,然后對(duì)每一部分列表遞歸調(diào)用其本身,繼續(xù)該列表的遞歸分解,直至達(dá)到該遞歸的基本情形,這是列表被分割成長(zhǎng)度為1的列表,根據(jù)定義,此時(shí)已排序好。

private static <T extends Comparable<T>> void mergeSort(T[] data, int min , int max){if(min < max){int mid = (min+max)/2;mergeSort(data,min,mid);mergeSort(data,mid+1,max);merge(data,min,mid,max);} }private static <T extends Comparable<T>> void merge(T[] data, int first , int mid, int last){T[] temp = (T[])(new Comparable[data.length]);int first1 = first, last1 = mid;int first2 = mid+1, last2 = last;int index = first1;//復(fù)制每一個(gè)子序列中的更小的元素到temp數(shù)組中,直到已排序好while(first1 <= last1 && first2 <= last2){if(data[first1].compareTo(data[first2]) < 0){temp[index] = data[first1];first1++;} else {temp[index] = data[first2];first2++;}index++;}//從第一個(gè)子序列中復(fù)制剩余的元素到temp數(shù)組中while(first1 <= last1){temp[index] = data[first1];first1++;index++;}//從第二個(gè)子序列中復(fù)制剩余的元素到temp數(shù)組中while(first2 <= last2){temp[index] = data[first2];first2++;index++;}//復(fù)制歸并數(shù)據(jù)temp到原始的序列中for(index = first; index <= last; index++){data[index] = temp[index];} }

總結(jié)

以上是生活随笔為你收集整理的数据结构与算法-排序与查找(java描述)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。