排序算法的java實(shí)現(xiàn)(部分)

1.歸并排序

package sort;

import java.util.Arrays;

public class MergeSort {

/**

* 歸并排序 簡介:將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)有序表,即把待排序的序列分成若干個(gè)子序列,每個(gè)序列是有序的。

* 然后再把有序的子序列合并成整體有序的序列。 時(shí)間復(fù)雜度為o(nlogn) 穩(wěn)定排序方式

*

* @param nums 待排序數(shù)組

* @return 輸出有數(shù)數(shù)組

*/

public static int[] sort(int[] nums, int low, int high) {

int mid = (low + high) / 2;

if (low < high) {

// 左邊

sort(nums, low, mid);

// 右邊

sort(nums, mid + 1, high);

// 左右歸并

merge(nums, low, mid, high);

}

return nums;

}

public static void merge(int[] nums, int low, int mid, int high) {

int[] temp = new int[high - low + 1];

int i = low;// 左指針

int j = mid + 1;// 右指針

int k = 0;

// 把較小的數(shù)先移到新數(shù)組中

while (i <= mid && j <= high) {

if (nums[i] < nums[j]) {

temp[k++] = nums[i++];

} else {

temp[k++] = nums[j++];

}

}

// 把左邊剩余的數(shù)移入數(shù)組

while (i <= mid) {

temp[k++] = nums[i++];

}

// 把右邊邊剩余的數(shù)移入數(shù)組

while (j <= high) {

temp[k++] = nums[j++];

}

// 把新數(shù)組中的數(shù)覆蓋nums數(shù)組

for (int k2 = 0; k2 < temp.length; k2++) {

nums[k2 + low] = temp[k2];

}

}

// 歸并排序的實(shí)現(xiàn)

public static void main(String[] args) {

int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };

MergeSort.sort(nums, 0, nums.length - 1);

System.out.println(Arrays.toString(nums));

}

}


2.冒泡排序

package sort;

import java.util.Arrays;

//簡單冒泡排序

//冒泡排序重復(fù)地走過要排序的數(shù)列,一次比較兩個(gè)元素,若順序錯(cuò)誤就把他們交換,直到?jīng)]有需要交換

public class BubbleSort1 {

//比較相鄰的元素,若第一個(gè)比第二個(gè)大,就交換,對(duì)每一對(duì)相鄰元素做同樣工作,從開始第一對(duì)到結(jié)尾最后一對(duì)。

//針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè),持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

/*public static? void bubble(int[] nums){int temp;int size = nums.length;for(int i=0;inums[j]){

temp = nums[i];

nums[i] = nums[j];

nums[j] = temp;

}

}

}

}*///嚴(yán)格上說這段代碼不是標(biāo)準(zhǔn)的冒泡排序,因?yàn)樗粷M足“兩兩比較”,應(yīng)該是最簡單的交換排序,效率非常低

/*public static void bubble(int[] nums){int temp;int size = nums.length;for(int i=0;ii;j--){

if(nums[j-1]>nums[j]){

temp = nums[j-1];

nums[j-1] = nums[j];

nums[j] = temp;

}

}

}

}*///這樣的冒泡排序還可以優(yōu)化,如果待排序的序列是{2,1,3,4,5,6,7,8,9},第一和第二的關(guān)鍵字交換后就沒必要再交換了。

public static void bubble(int[] nums){int temp;int size = nums.length;int flag = 1;for(int i=0;ii;j--){

if(nums[j-1]>nums[j]){

temp = nums[j];

nums[j] = nums[j-1];

nums[j-1] = temp;

flag = 1;

}

}

}

}//對(duì)于{2,1,3,4,5,6,7,8,9},當(dāng)i=2時(shí)已經(jīng)對(duì)9和8,8和7..做了比較,沒有交換的數(shù)據(jù),說明序列已有序,不需要增加循環(huán),可以增加一個(gè)標(biāo)記變量flag實(shí)現(xiàn)改進(jìn)

public static void main(String[] args) {

// TODO Auto-generated method stub

int[] nums ={7,6,4,9,5,2,0,1,3,8};

bubble(nums);

System.out.println(Arrays.toString(nums));

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,921評(píng)論 0 33
  • 最常見的七大排序算法,整理了下,包括時(shí)間復(fù)雜度和空間復(fù)雜度都做一個(gè)詳細(xì)的解說,希望對(duì)需要的人能有所幫助。 /** ...
    PapiAP閱讀 386評(píng)論 0 2
  • 轉(zhuǎn)載自:https://egoistk.github.io/2016/09/10/Java%E6%8E%92%E5...
    chad_it閱讀 1,062評(píng)論 0 18
  • 首先總結(jié)以下Java和C、C++中的一般控制臺(tái)輸入方式,方便以后的編程題: java鍵盤輸入 java讀文件(會(huì)自...
    androidjp閱讀 2,383評(píng)論 0 16
  • 樓下其實(shí)是一個(gè)非常浪漫的地方。 一開始推開窗戶,大家個(gè)子都小小的,墊著腳尖往下望,身材瘦弱的那個(gè)男生仰頭瞇著眼睛叫...
    Crust閱讀 279評(píng)論 0 0

友情鏈接更多精彩內(nèi)容