数据结构与算法-排序与查找(java描述)
在軟件開(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)一下,就是直接把找到的元素返回即可。
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é)果。
二、排序
排序分為
順序排序:選擇,插入,冒泡排序;
對(duì)數(shù)排序:快速,歸并排序;
2.1、選擇排序
通過(guò)掃描整個(gè)列表找出最小值,將這個(gè)值與該列表的第一個(gè)位置的值交換。掃描剩余(除了第一個(gè)值)部分列表并找出最小值,然后將它和該列表的第二個(gè)位置處的值交換。以此類推下去。
外層循環(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)位置。
2.3、冒泡排序
重復(fù)的比較列表中的相鄰的元素,如果發(fā)現(xiàn)某個(gè)相鄰的元素的位置不對(duì)的時(shí)候,就將這兩個(gè)元素的位置交換。
2.4、快速排序
通過(guò)任意選定的分區(qū)元素將該列表分區(qū),然后對(duì)分區(qū)元素的任一邊的子列表進(jìn)行遞歸排序。
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)題。
- 上一篇: 一看就懂的动态规划入门教程
- 下一篇: shiro教程(1)-基于url权限管理