排序算法和查找算法总结
#排序算法總結(jié)
1.冒泡排序
解釋:
? 所謂冒泡排序,就是如同水里的泡泡一樣,將合適的值一次次往上冒,直到所有數(shù)據(jù)全部處理完成。
在數(shù)據(jù)中的解釋就是:從第一個(gè)數(shù)開始,每次都將前一個(gè)數(shù)與后一個(gè)數(shù)作比較,如果前一個(gè)數(shù)大于后一個(gè)數(shù),則將兩者交換位置(否則不交換),此時(shí),后一個(gè)數(shù)值已變化,然后再將后一個(gè)數(shù)與后后一個(gè)數(shù)作比較,重復(fù)操作,直到所有的數(shù)都比較完成。
算法過(guò)程:
? 先定義一個(gè)外循環(huán),控制整個(gè)排序次數(shù)(排序次數(shù)為數(shù)據(jù)的個(gè)數(shù)),然后再內(nèi)嵌一個(gè)內(nèi)循環(huán),在內(nèi)循環(huán)中進(jìn)行每次排序的比較,內(nèi)循環(huán)的比較次數(shù)為:數(shù)據(jù)個(gè)數(shù)-當(dāng)前排序次數(shù),因?yàn)?#xff0c;比如說(shuō),在第一次比較時(shí),比較得出的結(jié)果一定是數(shù)據(jù)中的最大值,并排在最后,此時(shí),最大值已知,不用再進(jìn)行比較了,以此類推,每次都會(huì)減少一次比較。
時(shí)間復(fù)雜度:
? 第一次循環(huán)n,第二次循環(huán)n,綜合為O(n^2)。
算法實(shí)現(xiàn):
public class test1 {public static void main(String[] args) {int[] nums = {5,2,1,4,3,};//下面進(jìn)行冒泡排序for(int i = 0;i < nums.length-2;i++) { //外層循環(huán)控制排序次數(shù)for(int j = 0;j < nums.length-1-i;j++) { //內(nèi)存循環(huán)控制每趟比較次數(shù)if(nums[j] > nums[j+1]) { //交換位置操作int temp = nums[j];nums[j] = nums[j+1];nums[j+1] = temp;}}}for(int x : nums) {System.out.print(x + " ");}} }?
2.選擇排序
解釋:
? 所謂選擇排序,就是每次選擇出當(dāng)前比較數(shù)據(jù)的最小值,然后將其傳遞到數(shù)據(jù)的前面。
算法過(guò)程:
? 第一步:定義一個(gè)外層循環(huán),控制排序次數(shù),循環(huán)次數(shù)為數(shù)據(jù)個(gè)數(shù)-1。
? 第二步:定義一個(gè)變量k,這個(gè)變量等于外層循環(huán)的次數(shù)的起始值 i ,目的是存放當(dāng)前需要操作的數(shù)據(jù)的第一個(gè)數(shù),以便與后面的數(shù)比較。
? 第三步:定義一個(gè)內(nèi)層循環(huán),這個(gè)內(nèi)層循環(huán)代表著當(dāng)前需要比較的次數(shù),起始值為k+1,因?yàn)閗是當(dāng)前數(shù)據(jù)的第一個(gè)位置,不需要讓自己比自己,結(jié)束位置為數(shù)據(jù)末端,即數(shù)據(jù)的長(zhǎng)度。
? 第四步:將k位置的數(shù)與數(shù)據(jù)比較,如果比較的數(shù)小于k位置的數(shù),則將這個(gè)索引賦給k,以此類推,最后每次比較結(jié)束都會(huì)找到當(dāng)前數(shù)據(jù)的最小值。
? 第五步,將第i的位置的數(shù)據(jù)與k的數(shù)據(jù)交換,即將最小值放到前面。
? 第六步:再次操作以上步驟,直到數(shù)據(jù)全部完成。
時(shí)間復(fù)雜度:
? O(n^2)
算法實(shí)現(xiàn):
public class test1 {public static void selectSort01(int[] nums) {for(int i = 0;i < nums.length-1;i++) { //外層循環(huán)定義排序次數(shù)int k = i; //獲取每次操作的數(shù)據(jù)的第一個(gè)數(shù)據(jù)的索引,也就是每次從需要比較的第一個(gè)數(shù)開始(已經(jīng)比較出的最小數(shù)不需要再比較)for(int j = i + 1;j < nums.length;j++) {//內(nèi)層循環(huán)將從第一個(gè)數(shù)開始往后比較。if(nums[j] < nums[k]) { //判斷前一個(gè)數(shù)和后一個(gè)數(shù)之間的大小k = j; //后一個(gè)數(shù)如果小于前一個(gè)數(shù),則將二者的索引交換}}//上述得出當(dāng)前比較數(shù)據(jù)的最小值//下方較當(dāng)前的最小值,與當(dāng)前比較數(shù)據(jù)的開頭數(shù)據(jù)進(jìn)行交互,最小值將會(huì)傳遞到開始的位置,這個(gè)數(shù)及位置將不會(huì)參與下次比較int temp = nums[i]; nums[i] = nums[k];nums[k] = temp;}} public static void main(String[] args) {int[] nums = {2,5,6,3,0,-4};selectSort01(nums);for(int x : nums) {System.out.print(x + " ");} } }3.插入排序
解釋:
? 所謂插入排序,就是將后面的數(shù)與前面的數(shù)比較,如果后面的數(shù)小于前面的數(shù),就將后面的數(shù)插入到前面的數(shù)的前面。
算法過(guò)程:
? 所謂插入排序,就是從第二個(gè)數(shù)開始,依次向前比較,如果前面一個(gè)數(shù)小于這個(gè)數(shù),那么就將前面一個(gè)數(shù)右移,將前面一個(gè)數(shù)的位置賦空(看了代碼就明白),然后再比較這個(gè)數(shù)與前前一個(gè)數(shù),如果前前一個(gè)數(shù)大于這個(gè)數(shù),則將這個(gè)前前的數(shù)賦給這個(gè)空位置,前前一個(gè)數(shù)的原位置則就代表了空,重復(fù)以上操作,最后將空位置補(bǔ)上當(dāng)前操作的數(shù)即可,直到全部比較完成。
時(shí)間復(fù)雜度:
? O(n^2);
代碼實(shí)現(xiàn):
public static void insertSort(int[] nums) {for(int i = 1;i < nums.length;i++) {int target = nums[i]; //獲得需要放到確定位置的元素int j = i;while(j > 0 && target < nums[j-1]) { //判斷所要比較的數(shù)的索引是否到了最開始的位置,并且比較的數(shù)是否小于其前面一個(gè)數(shù)nums[j] = nums[j-1]; //如果判斷成立,則將前一個(gè)數(shù)的數(shù)據(jù)右移,此時(shí)前一個(gè)數(shù)的位置為空,目的是用來(lái)存放目標(biāo)值。j--; //將索引-1,即再比較前面一個(gè)數(shù)(先減再比較)}nums[j] = target;} } public static void main(String[] args) {// TODO Auto-generated method stubint[] nums = {1,5,3,6,7};insertSort(nums);for(int num : nums) {System.out.print(num);} } }4.快速排序
解釋:
? 一個(gè)效率極其高的排序算法。
算法過(guò)程:
? 先設(shè)定一個(gè)基準(zhǔn)(一般為數(shù)組最左邊的數(shù))。一個(gè)從左往右開始檢索的起始索引,一個(gè)從右往左開始檢索的起始索引(如果左索引大于有索引,則被認(rèn)定為不合法,無(wú)需進(jìn)行一下操作,須提前判斷)。
? 然后先從數(shù)組右邊開始向左邊檢索,直到檢索的數(shù)小于基準(zhǔn)(前提是該索引不能小于左邊的索引),即先暫停,取出這個(gè)位置的索引 j。
? 然后再?gòu)淖笸覚z索,直到檢索的數(shù)大于基準(zhǔn)(前提是該索引不能大于當(dāng)前右邊的索引),即先暫停。取出這個(gè)位置的索引 i。
? 交換兩個(gè)索引位置的數(shù)。(在兩種索引不相等的前提下,繼續(xù)循環(huán)上述操作)。
? 當(dāng)兩個(gè)索引相遇時(shí),此時(shí)索引右邊的數(shù)就是全部大于基準(zhǔn)的數(shù),索引左邊的數(shù)就是全部小于基準(zhǔn)的數(shù)。
? 然后將相遇索引位置的數(shù)與基準(zhǔn)交換。
? 然后分別遞歸相遇索引右邊的數(shù)組和左邊的數(shù)組(不含索引)
? 最終排序成功。
時(shí)間復(fù)雜度:
? O(nlogn);
注意問(wèn)題:
? 每次檢索時(shí),必須先從右邊開始檢索,因?yàn)閖在變,i < j始終需要成立。當(dāng)然還得根據(jù)具體情況而定,這是個(gè)注意點(diǎn)。
代碼實(shí)現(xiàn):
public static void quickSort(int[] arr,int left,int right) {if(left > right) { //判斷左索引是否大于右索引,如果是,則不合法。直接返回退出排序。return;}int base = arr[left]; //設(shè)置基準(zhǔn),一般為最左邊的數(shù)int i = left; //設(shè)定從左往右檢索角標(biāo)的實(shí)時(shí)位置int j = right; //設(shè)定從有往左檢索角標(biāo)的實(shí)時(shí)位置while(i != j) {//從右往左檢索比基準(zhǔn)小的數(shù),找到即先停下,且必須先從右往左執(zhí)行while(arr[j] >= base && i < j) {j--;}//從左往右檢索比基準(zhǔn)大的數(shù),找到即先停下while(arr[i] <= base && i < j) {i++;}//通過(guò)上述兩個(gè)循環(huán)必定找到指定數(shù),然后將兩個(gè)數(shù)交換int temp = arr[j];arr[j] = arr[i];arr[i] = temp;}//上述循環(huán)結(jié)束代表i==j了,即兩個(gè)角標(biāo)重合//此時(shí)將基準(zhǔn)與重合位置的數(shù)交換arr[left] = arr[i];arr[i] = base;//遞歸繼續(xù)執(zhí)行上述操作//遞歸排序左邊的數(shù)quickSort(arr, left, i - 1);//遞歸排序有邊的數(shù)quickSort(arr, i+1, right); }?
?
#查找算法總結(jié)
1.二分查找(折半查找)
解釋:
? 在一個(gè)事先排好序的數(shù)組中,查找一個(gè)數(shù)所在的索引位置。
算法過(guò)程:
? *提前準(zhǔn)備:
? 定義一個(gè)方法,設(shè)定兩個(gè)參數(shù),第一個(gè)為排好序的數(shù)組,第二個(gè)為需要查詢的數(shù)。在方法內(nèi)部定義三個(gè)變量,分別為top(代表每次查找部分的第一個(gè)數(shù)的索引),bottom(代表每次查找部分的最后一個(gè)數(shù)的索引),mid(代表每次查找部分的中間位置的數(shù),mid=(top+bottom)/2)。
? *過(guò)程:
? 首判斷我們每次執(zhí)行后的top和bottom是否不在同一位置,如果不在,則代表全部查完了也沒找到,此時(shí)須返回查詢失敗標(biāo)志,反之,代表還有數(shù)可查,繼續(xù)查詢。
? 每次查詢的時(shí)候mid都會(huì)變成當(dāng)前查詢部分的中間值索引,然后判斷該中間值是否與查詢的數(shù)相等,若相等,則返回該中間值索引,查詢成功。否則,判斷,該中間值是大于查詢值還是小于查詢值。如果大于查詢值,則代表查詢的值一定在中間值索引的左邊,否則,在其右邊。此時(shí),目標(biāo)數(shù)組就會(huì)變成需要查詢的部分,然后改變top和bottom及mid到對(duì)應(yīng)的新值。重復(fù)執(zhí)行以上過(guò)程,直到查詢成功或失敗。
代碼實(shí)現(xiàn):
public static int search(int[] nums,int num) {int top = 0;int bottom = nums.length - 1;while(top <= bottom) {int mid = (top + bottom)/2;if(num == nums[mid]) {return mid;}else if(num < nums[mid]) { //代表目標(biāo)數(shù)num在數(shù)組的左邊bottom = mid - 1;mid = (top + bottom)/2;}else { //代表目標(biāo)數(shù)num在數(shù)組的右邊top = mid + 1;mid = (top + bottom)/2;}}return -1; //查詢失敗返回值}?
總結(jié)
以上是生活随笔為你收集整理的排序算法和查找算法总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三维激光扫描后处理软件_三维激光扫描技术
- 下一篇: 中文参考文献格式