排序(2)二分排序、快速排序、归并排序
生活随笔
收集整理的這篇文章主要介紹了
排序(2)二分排序、快速排序、归并排序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
排序(2)–二分排序、快速排序、歸并排序
*二分排序
快速排序:
/*** 平均時(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)題。
- 上一篇: linux课程设计qq,仿QQ聊天系统课
- 下一篇: inputstream转fileinpu