快速排序用到的知識點,遞迴,分制。
思想,如果將數列要從小到大的排列,先取乙個數做為比較數a(一般取要數列或者拆開數列的第乙個數,也看個人習慣),先從右往左找比a小的資料,並交換資料。交換完資料後,在互動資料的位置從左往右找比a大的資料,找到後,再交換資料。這算是一輪結束。這一輪結束後,左索引會將陣列分成兩半,然後將0到左索引與左索引到末尾變成兩組陣列,然後遞迴分制,上面的迴圈。直到每個陣列的左索引和右索引相同了,說明這個陣列就排好了。
演算法擔心的問題:乙個陣列被索引分開後,會擔心前半部分的最大數會比後半部分的最小數要大。
解疑:不會出現這樣問題的,演算法設計是(比如從小到大排),先從左邊第乙個作為比較數a,左索引為l=0,右索引為r=陣列的長度。先從右索引往左找比a小的數,找不到就r--,直到在r1位置找到了比a小的資料,就將r1位置的與l位置的資料互換(此時l位置的資料就是0,也是比較數a,)換完之後此時,r1+1位置到r的位置都比a要大,上半輪結束。下半輪開始,從左索引(l)往右找比r1(此時的r1位置就是a)位置大的數,找不到就l++,直到在l1位置找到比r1位置大的數然後交換r1與l1位置的數,此時l1位置的數就是a,下半輪結束。這一輪結束後,這個數列從0位置到l1位置的數都是比l1位置的數(即a)都小或等於(等於性質放在左右邊都可以),然後從l1到末尾的數都是比l1位置(即a)都大的數。這樣由l1位置將這個陣列分成兩組(不拆陣列),每組進行單獨排序(分制遞迴)。就可保障這個陣列從小到大排列。
package src.main.lib;
public class 快速排序 ;
// int arr = ;
quick_sort(arr, 0, 7);
} // 快速排序
public static void quick_sort(int s, int l, int r) ;
if (l < r)
if (i < j)
system.out.println("左索引:" + i + ",右索引:" + j);
print(s);
system.out.println();// 4,9,7,4
// i = l;
// j = r;
while (i < j && s[i] < x)
if (i < j)
system.out.println("左索引:" + i + ",右索引:" + j);
print(s);
system.out.println();// 4,5,7,9
}// s[i] = x;
if (l < (i - 1))
if ((i + 1) < r)
} }public static void print(int arr)
}}
快速排序演算法解析
一趟快速排序的演算法是 1 設定兩個變數i j,排序開始的時候 i 0,j n 1 2 以第乙個陣列元素作為關鍵資料,賦值給key,即key a 0 3 從j開始向前搜尋,即由後開始向前搜尋 j 找到第乙個小於key的值a j 將a j 和a i 互換 4 從i開始向後搜尋,即由前開始向後搜尋 i ...
快速排序 簡單解析
如果使用插入排序將陣列按從小到大排序,在插入排序0的時候,需要依次判斷前移找到最前面的位置,這使得排序判斷成本增加。快速排序則是對這種情況的一種優化排序,是氣泡排序的一種改進。取乙個中間標準點,將大於這個標準點的值和小於標準點的值進行分組並放置在這個標準點的左右兩側,然後按照順序遞迴排序左右兩組的資...
Scala快速排序演算法解析
一 源 def sort ls list int list int 二 演算法的核心 1 快速排序事先選取乙個元素作為用來比較的基準。比基準大的數放在右邊,比基準小的數放在左邊,一次分成大 小兩類。2 每一類又通過選取乙個基準再次進行大小的分類。直到左右兩邊沒有資料為止。三 遞迴的解釋 理解遞迴的關...