java排序演算法個人總結
快速排序
static void _quick_sort(int array[], int start, int end){
int middle;
if(start >= end)
return;
middle = get_middle(array, start, end);
_quick_sort(array, start, middle -1);
_quick_sort(array, middle + 1, end);
}
private static int get_middle(int[] array, int start, int end) {
int tmp = array[start]; //陣列的第一個作為中軸
while (start < end) {
while (start < end && array[end] > tmp) {
end--;
}
array[start] = array[end]; //比中軸小的記錄移到低端
while (start < end && array[start] <= tmp) {
start++;
}
array[end] = array[start]; //比中軸大的記錄移到高階
}
array[start] = tmp; //中軸記錄到尾
output(array,"step"+ ++index +":");
return start; //返回中軸的位置
}
static void quick_sort(int array[], int length){
index = 0;
if(null == array || 0 == length)
return;
_quick_sort(array, 0, length-1);
output(array,"");
}
改進冒泡
private static void bubble_sort(int[] array) {
index = 0;
int i_last_swap = -1;
int i_last_swap_tmp = 0;
for (int i = 0; i < array.length
&& (i_last_swap_tmp != i_last_swap) //排除已有序的區間
&& (i_last_swap_tmp != array.length-1);//上次排序僅交換了最後兩位
++i){
i_last_swap = i_last_swap_tmp;
System.out.println("["+i_last_swap+","+ (int)(array.length-1) +"]:");
for (int j = array.length - 1; j > i_last_swap; --j) //從後往前冒泡
{
if (array[j] < array[j - 1])
{
int i_tmp = array[j];
array[j] = array[j - 1];
array[j - 1] = i_tmp;
i_last_swap_tmp = j;
output(array, "last_swap_loctaion:"+j+"\nsetp"+ ++index +":");
}
}
if (i_last_swap_tmp == i_last_swap)
{
System.out.println("已有序!");
}
}
return;
}
//雙向掃描冒泡,效率最高的冒泡,在上一個改進的基礎上每次反向冒泡一次
public static void ImproveBubble3(int [] array){
int low, up, _index, i;
low = 0;
up = array.length - 1;
_index = low;
while( up > low)
{
System.out.println("["+ low +","+ up +"]:");
for( i = low; i < up; i++) //從上向下掃描
{
if(array[i] > array[i + 1])
{
int i_tmp = array[i];
array[i] = array[i + 1];
array[i + 1] = i_tmp;
_index = i;
output(array, "last_swap_loctaion:"+ i +"\nsetp"+ ++index +":");
}
}
up = _index; //記錄最後一個交換的位置
for(i = up; i > low; i--) //從最後一個交換位置處從下向上掃描
{
if(array[i] < array[i-1])
{
int i_tmp = array[i];
array[i] = array[i - 1];
array[i - 1] = i_tmp;
_index = i;
output(array, "last_swap_loctaion:"+ i +"\nsetp"+ ++index +":");
}
}
low = _index; //記錄最後一個交換的位置
}
}
相關推薦
java排序演算法個人總結
快速排序 static void _quick_sort(int array[], int start, int end){ int middle; if(start >= end)
十大經典排序演算法詳細總結(含JAVA程式碼實現)
文章目錄 十大經典排序演算法詳細總結(含JAVA程式碼實現) 0、排序演算法說明 1、氣泡排序(Bubble Sort) 2、選擇排序(Selection Sort) 3、插入排序(Insertion Sort) 4、希爾
幾個內部排序演算法的總結(JAVA版)
插入排序 1、直接插入排序 public void insertSort(int[] a){ for(int i=0;i<a.length;i++){ int key=a[i]; int pos=i; while(pos>0&&a
快速排序演算法歸納總結-java
第一個分割槽函式 // arr[]為陣列,start、end分別為陣列第一個元素和最後一個元素的索引 // povitIndex為陣列中任意選中的數的索引 int partition(int a
經典內部排序演算法學習總結(演算法思想、視覺化、Java程式碼實現、改進、複雜度分析、穩定性分析)
一、什麼是排序演算法? 排序,顧名思義,就是按照一定的規則排列事物,使之彼此間有序 而排序演算法所要做的工作,就是將資料按照人為制定的比較規則排列好,使資料處於彼此間有序的狀態。 二、為什麼要進行排序? 那為什麼要將資料排序呢?計算機處理速度這麼
java排序演算法—氣泡排序
快速排序 氣泡排序的思想方法: 1.從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大(小)的資料元素交換到了無序佇列的隊尾,從而成為有序序列的一部分; 2.下一次繼續這個過程,直到所有資料元素都排好序。演算法的核心在於每次通過兩兩比較交換位置,選出剩餘無序序列裡最大(小
java排序演算法—快速排序
快速排序 快速排序的思想方法: 1.先從數列中取出一個數作為基準數,記為x。 2.分割槽過程,將不小於x的數全放到它的右邊,不大於x的數全放到它的左邊。(這樣key的位置左邊的沒有大於key的,右邊的沒有小於key的,只需對左右區間排序即可)。 3.再對左右區間重複第二步,直到各區間
排序演算法的總結
學習了選擇排序演算法、插入排序演算法、氣泡排序演算法等。 選擇排序演算法: 時間複雜度是O(n*n) 主要思想是: 每次迴圈是第i個與後面的元素逐個比較,一次迴圈後得出了最大值,放在了第i個位置上
基本排序演算法的總結
# 插入排序 public static int[] insertSort2(int[] arr) { if (arr.length < 2 || arr == null) { return arr; } // 假設
常用Java排序演算法詳解
一、最小堆排序(MinHeapSort) 基本原理:對於給定的n個記錄,初始時把這些記錄看作一顆順序儲存的二叉樹,然後將其調整為一個小頂堆,然後將堆的最後一個元素與堆頂元素進行交換後,堆的最後一個元素即為最小記錄;接著講前(n-1)個元素重新調整為一個小頂堆,再將堆頂元素與當前
內部排序演算法要點總結
本文將對於插入排序、氣泡排序、選擇排序、希爾排序、歸併排序、快速排序、堆排序、分配排序和基數排序做歸納總結,通過一些題目來掌握各大內部排序演算法的過程和特點,而不涉及具體的程式碼。 考點 排序演算法的穩定性(題1) 排序演算法的空間效率(題2)
幾種初級排序演算法的總結
@TOC 幾種初級排序演算法的總結 排序就是將一組物件按照某種邏輯順序重新排列的過程。 在本文中我們使用的操作: 遍歷陣列 比較兩個物件(本文中所有程式碼示例中的less方法) 交換兩個物件 (本文中所有程式碼示例中的
java排序演算法(二)------插入排序
插入排序 直接插入排序基本思想: 每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。 public static void sort(int[] arr) { int i; int t; for (int j
java排序演算法(三)------選擇排序
選擇排序 基本思想:每一趟從待排序的資料元素中選擇最小(或最大)的一個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。 選擇排序的時間複雜度和空間複雜度分別為 O(n2 ) 和 O(1) 程式碼實現: public static void s
java排序演算法(四)------希爾排序
希爾排序 希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的一個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破O(n2)的第一批演算法之一。 程式碼實現: /** *希爾排序的誕生是由於插入排序在處理大規模陣列的時候會遇到需要移動太多元素的問
java排序演算法(四)------歸併排序
歸併排序: 是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。 合
java排序演算法(七)------堆排序
堆排序 程式碼實現: public static void sort01(int[] arr) { for (int i = 0; i < arr.length; i++) { headAdust01(arr, arr.length - 1
java排序演算法(八)------桶式排序
桶式排序 實現程式碼: /** *桶式排序:有限個數字m,每個數字的大小都在1與n之間 *,則我們可以假設有n個桶,遍歷m個數字,將其存入對應的桶中 *(如數字的值為3,就存入3號桶,桶的值對應存入數字的個數) */ public class Bucke
java排序演算法(九)------基數排序
基數排序 程式碼實現: public class RadixSort { public static void sort(int[] a) { int digit = 0;// 陣列的最大位數 for (int i
Java排序演算法之——氣泡排序,插入排序,選擇排序
<1>氣泡排序 這個名詞的還是很形象的,就是每次比較相鄰的兩個數,大的數總是往後面冒,所以每輪比較結束後,大數都會冒到最後面。 每次比較的結果如下: 無序陣列 :8 2 4 3 5 7 1 9 6 (後面所有的排序都將使用這個陣列) 第一輪比較:2 4 3 5