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

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

生活随笔

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

编程问答

排序(2)二分排序、快速排序、归并排序

發(fā)布時(shí)間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序(2)二分排序、快速排序、归并排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

排序(2)–二分排序、快速排序、歸并排序


*二分排序

/*** 二分排序中,關(guān)鍵字的比較次數(shù)采用折半查找,數(shù)量級(jí)為O(nlogn),* 但是元素移動(dòng)次數(shù)為O(n^2),因此時(shí)間復(fù)雜度為O(n^2)。* @author yj*/ public class BinarySort {/*** 二分法插入排序是在插入第i個(gè)元素時(shí),對(duì)前面的0~i-1元素進(jìn)行折半,* 先跟他們中間的那個(gè)元素比,如果小,則對(duì)前半再進(jìn)行折半,否則對(duì)后半進(jìn)行折半,* 直到left>right,然后再把第i個(gè)元素前1位與目標(biāo)位置之間的所有元素后移,* 再把第i個(gè)元素放在目標(biāo)位置上。*/public static void binarySort(int[] source){int left,right,middle;//left>right說(shuō)明找到了位置int temp;for(int i = 1;i<source.length;i++){left = 0;//初始化左指向首個(gè)元素right = i-1;//右指向需要插入元素的左側(cè)temp = source[i];//記錄需要排序的元素while(left<=right){middle = (right+left)/2;if(source[middle]>temp){//中間元素大于待插入元素,說(shuō)明插入位置在middle左側(cè)right = middle -1;//將右指向?yàn)樽蟀?/span>}else {left = middle + 1;}}for(int j = i-1;j>=left;j--){//插入操作,將元素右移source[j+1]=source[j];}source[left] = temp;spy(source);//顯示排序的過(guò)程}}/*** 方便觀察每次排序,可以窺探數(shù)組排序的情況* @param source*/public static void spy(int[] source){for(int k = 0;k<source.length;k++){System.out.printf(source[k]+" "); }System.out.println();} }

快速排序:

/*** 平均時(shí)間復(fù)雜度為O(nlgn/ig2);最差為O(n^2);空間復(fù)雜度O(logn)* 是不穩(wěn)定排序* 該方法的基本思想是:1.先從數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)。* 2.分區(qū)過(guò)程,將比這個(gè)數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。* 3.再對(duì)左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個(gè)數(shù)。* @author yj*/ public class QuickSort {/*** 快速排序* @param source* @param low* @param high*/public static void quickSort(int[] source,int low,int high){int pivotpos;//記錄基準(zhǔn)位置if(low<high){pivotpos = partition(source,low,high);quickSort(source, low, pivotpos - 1);//左半邊quickSort(source, pivotpos + 1, high);//右半邊}}/*** 劃分算法* @param source* @param i* @param j* @return i 基準(zhǔn)位置*/private static int partition(int[] source, int i, int j) {int pivot = source[i];//將第一個(gè)數(shù)據(jù)記錄為基準(zhǔn)while(i<j){while(i<j&&source[j]>=pivot){j--;}if(i<j)source[i++] = source[j];//相當(dāng)于source[i] = source[j];i++spy(source);//打印排序情況while(i<j&&source[i]<=pivot){i++;}if(i<j)source[j--] = source[i];spy(source);//打印排序情況}source[i] = pivot;return i;}/*** 方便觀察每次排序,可以窺探數(shù)組排序的情況* @param source*/public static void spy(int[] source){for(int k = 0;k<source.length;k++){System.out.printf(source[k]+" "); }System.out.println();} }

*歸并排序

/*** 時(shí)間復(fù)雜度O(nlogn),空間復(fù)雜度O(n),是穩(wěn)定的排序* @author yj*/ public class MergeSort {public static void mergeSort(int[] s,int start,int end){if(start<end){//兩路歸并int middle = (start+end)/2;mergeSort(s,start,middle);mergeSort(s, middle+1, end);//將兩組數(shù)據(jù)歸并merge(s,start,middle,middle+1,end);}}/*** 兩組數(shù)據(jù)歸并* @param s* @param start1* @param end1* @param start2* @param end2*/public static void merge(int[] s,int start1,int end1,int start2,int end2){int i,j;//數(shù)組1、2的兩個(gè)游標(biāo)i = start1;j = start2;int[] temp = new int[end2-start1+1];//建立一個(gè)數(shù)組為兩個(gè)之和大小,歸并到這個(gè)數(shù)組int k =0;while(i<=end1&& j<=end2){if(s[i]>s[j]){temp[k] = s[j];k++;j++;}else{temp[k] = s[i];k++;i++;}}//將剩余的元素加入temp中while(i<=end1){temp[k] = s[i];k++;i++;}while(j<=end2){temp[k] = s[j];k++;j++;}//將temp中數(shù)據(jù)轉(zhuǎn)移到原數(shù)組中for(int element :temp){s[start1] = element;start1++;}spy(s);}/*** 方便觀察每次排序,可以窺探數(shù)組排序的情況* @param source*/public static void spy(int[] source){for(int k = 0;k<source.length;k++){System.out.printf(source[k]+" "); }System.out.println();} }

總結(jié)

以上是生活随笔為你收集整理的排序(2)二分排序、快速排序、归并排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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