排序算法的java實現(部分)

1.歸并排序

package sort;

import java.util.Arrays;

public class MergeSort {

/**

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

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

*

* @param nums 待排序數組

* @return 輸出有數數組

*/

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;

// 把較小的數先移到新數組中

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

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

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

} else {

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

}

}

// 把左邊剩余的數移入數組

while (i <= mid) {

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

}

// 把右邊邊剩余的數移入數組

while (j <= high) {

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

}

// 把新數組中的數覆蓋nums數組

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

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

}

}

// 歸并排序的實現

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;

//簡單冒泡排序

//冒泡排序重復地走過要排序的數列,一次比較兩個元素,若順序錯誤就把他們交換,直到沒有需要交換

public class BubbleSort1 {

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

//針對所有的元素重復以上的步驟,除了最后一個,持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

/*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;

}

}

}

}*///嚴格上說這段代碼不是標準的冒泡排序,因為它不滿足“兩兩比較”,應該是最簡單的交換排序,效率非常低

/*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;

}

}

}

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

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;

}

}

}

}//對于{2,1,3,4,5,6,7,8,9},當i=2時已經對9和8,8和7..做了比較,沒有交換的數據,說明序列已有序,不需要增加循環,可以增加一個標記變量flag實現改進

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));

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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