算法之快速排序

快速排序:顧名思義就是排序過程比較快的排序方法(在排序過程當中交換時有可能位置跳躍比較大)。j_0018.gifc#

快速排序核心思想找數組的中值,從前日後找第一個比中值的大的數,從後往前找第一個比中值小的數,找到後將它們倆交換位置,一輪結束後,將數組分紅兩部分,繼續進行查找。數組

具體步驟:ide

(1)先給出一個無序數組,找到他的中值,從前日後找第一個比中值的大的數,從後往前找第一個比中值小的數,找到後將它們倆交換位置;函數

(2)判斷,若找到的這個大數位置和小數的位置都在中值處,或者大數位置在小數位置後面,則第一輪結束,將數組分爲兩部分;ui

(3)不然將找到的這兩個數交換,接着給大數的位置+1,小數的位置-1;繼續重複上面的步驟;spa

(4)當第一輪結束後,將數組按照(startIndex,highIndex-1)(lowIndex+1,endIndex)分紅兩部分,繼續重複上面的步驟直到將數排好序;blog

(5)將排好序的數組打印出來。排序

來看一下具體的程序:索引

using System;
using System.Collections.Generic;
using System.Text;
namespace prjquicksort
{
class Program
{
static void Main(string[] args)
{
int[] ary = new int[] { 2, 8, 6, 5, 7, 1, 9 };//先準備一個無序數組
quicksort(ary, 0, ary.Length - 1);//調用quicksort函數
foreach (int x in ary)//用foreach函數打印排好序後的數組
{
Console.WriteLine(x);
}
}
static void quicksort(int []ary, int startIndex, int endIndex)//快速排序
{
//起始索引大於等於結束索引實數時,直接返回。
if (startIndex>=endIndex)
{
return;
}
//中值等於起始索引加結束索引除2位置上的值。
int middle = ary[(startIndex + endIndex) / 2];
//比中指值大的數的索引(高位索引)初始化爲起始索引。
int highIndex = startIndex;
//比中值小的數的索引(低位索引)初始化爲結束索引。
int lowIndex = endIndex;
//排序次數不肯定,屢次排序後數組變成有序數組。
while (true)
{
//在數組中從高位索引到結束索引從前日後開始找第一個大於等於中值的數。
for (int i = highIndex; i <= endIndex; i++)
{
//若是找到了第一個大於等於中值的數,就將這個數的索引給高位索引,並跳出循環。
if (ary[i] >= middle)
{
highIndex = i;
break;
}
}
//在數組中從低位索引到起始索引從後往前開始找第一個小於等於中值的數。
for (int j = lowIndex; j >= startIndex; j--)
{
//若是找到了第一個小於等於中值的數,就將這個數的索引給低位索引,並跳出循環。
if (ary[j] <=middle)
{
lowIndex = j;
break;
}
}
//若是高位索引等於低位索引,則跳出循環。
if (highIndex == lowIndex)
{
break;
}
//若是高位索引大於低位索引,則跳出循環。
if (highIndex > lowIndex)
{
break;
}
//不然將找到的兩個數進行交換。
int temp = ary[highIndex];
ary[highIndex] = ary[lowIndex];
ary[lowIndex] = temp;
//下一次找的時候高位索引日後挪一位,低位索引往前挪一位。
highIndex++;
lowIndex--;
}
//將數組切成部分,第一部分從起始索引到高位索引-1;第二部分從低位索引+1到結束索引。
quicksort(ary, startIndex, highIndex - 1);
quicksort(ary, lowIndex + 1, endIndex);
}
}
}

運行結果:233359883.pngget

相關文章
相關標籤/搜索