快速排序

部份內容轉自坐在馬桶上看算法:快速排序啊哈算法關於快速排序法爲何必定要從右邊開始的緣由算法

快速排序的思想是選一個基準數,而後找到這個基準數在數組裏的位置,將大於它的放到它的右邊,小於它的放到它的左邊。數組

指針從兩邊向中間跑:ui

static void Main(string[] args)
{
    int[] a = { 45, 80, 55, 40, 42, 85 };
    quickSort(a, 0, a.Length - 1);
    foreach (var b in a)
    {
        Console.WriteLine(b.ToString());
    }
    Console.ReadLine();
}
static void quickSort(int[] array, int left, int right)
{
    int i, j, temp;
    if (left > right)
        return;
    temp = array[left];
    i = left;
    j = right;
    while (i != j)
    {
        while (array[j] >= array[left] && j > i)
            j--;
        while (array[i] <= array[left] && j > i)
            i++;
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    temp = array[i];
    array[i] = array[left];
    array[left] = temp;
    quickSort(array, left, i - 1);
    quickSort(array, i + 1, right);
}

指針從左往右跑:spa

public static int Partition(int[] a, int p, int r)
{
    int x = a[r];
    int i = p;
    int temp;
    for (int j = p; j <= r; j++)
    {
        if (a[j] < x)
        {
            temp = a[j];
            a[j] = a[i];
            a[i] = temp;
            i++;
        }
    }
    temp = a[r];
    a[r] = a[i];
    a[i] = temp;
    return i;
}
public static void QuickSort(int[] a, int p, int r)
{
    if (p < r)
    {
        int q = Partition(a, p, r);
        QuickSort(a, p, q - 1);
        QuickSort(a, q + 1, r);
    }
}
static void Main(String[] args)
{
    int[] a = { 7, 10, 3, 5, 4, 6, 2, 8, 9, 9 };
    QuickSort(a, 0, 9);
    for (int i = 0; i < a.Length; i++)
        Console.WriteLine(a[i].ToString());
    Console.ReadLine();
}

快速排序詳解:.net

關於爲何要讓哨兵j先動:指針

while(arr[j]>=temp&&i<j){
   j--;
}
while(arr[i]<=temp&&i<j){
   i++;
}
這裏兩個while的順序是不能改變的,想想:
假設對以下進行排序:
如上圖,6在左,9在右  咱們將6做爲基數。
假設從左邊開始(與正確程序正好相反)
因而i 就會移動到如今的數字7那個位置停下來,而j原來在數字9那個位置 ,由於
while(arr[j]>=temp&&i<j)
因而,j 也會停留在數字7那個位置,因而問題來了。當你最後交換基數6與7時,不對呀!!。
問題在於當咱們先從在邊開始時,那麼 i 所停留的那個位置確定是大於基數6的,而在上述例子中,爲了知足 i<j 因而 j也停留在7的位置
但最後交換回去的時候,7就到了左邊,不行,由於咱們本來 交換後數字6在邊應該是所有小於6,右邊所有大於6.但如今不行了。
因而,咱們必須從右邊開始,也就是從基數的對面開始。
相關文章
相關標籤/搜索