学而时习之,不亦说乎
在最坏的情况下,快速排序算法实际上要逊于归并排序与堆排序。但是,快速排序的平均速度要优于以上两种算法,而且在算法中无需额外的存储空间。
快速排序的思想是,将数组序列A划为两部分,以下标i分界,小于下标i的数组元素,其值均小于A[i],大于下标i的数组元素,其值均大于A[i]. 通过递归最终实现排序。
算法的关键是如何选取下标i,并且通过原址排序,将数组分为两部分。下面的示例算法中,首先选取数组最后的一个元素作为标志,将大于该元素的值向右移动,小于该元素的值向左移动,最后将这最后一个元素插入(实际上是交换)到数组中合适的位置。这部分的思路不是很容易理解(真是佩服想到这个算法的人...)结合代码看看吧...
C++代码示例:
int main()
{
int A[] = {23, 17, 14, 6, 13, 10, 1, 5, 7, 12, -9, 36, 72, 113, -10, 0};
QuickSort(A, 0, 15);
system("pause");
return 0;
}
// Divide an array into two parts
int Partition(int* A, int p, int r)
{
int x = A[r];
int index = p - 1;
for (int i = p; i < r; i++)
{
if (A[i] <= x)
{
index++;
int temp = A[i];
A[i] = A[index];
A[index] = temp;
}
}
A[r] = A[index + 1];
A[index + 1] = x;
return index + 1;
}
void QuickSort(int* A, int p, int r)
{
int q = Partition(A, p, r);
if (q <= p || q >= r)
{
return;
}
QuickSort(A, p, q - 1);
QuickSort(A, q + 1, r);
}
Java代码示例:
public class Hello {
public static void main(String[] args) {
int A[] = {23, 17, 14, 6, 13, 10, 1, 5, 7, 12, -9, 36, 72, 113, -10, 0};
quickSort(A, 0, 15);
for (int i : A) {
System.out.print(i + ", ");
}
}
public static void quickSort(int [] A, int p, int r) {
int q = partition(A, p, r);
if (q <= p || q >= r) {
return ;
}
quickSort(A, p, q - 1);
quickSort(A, q + 1, r);
}
public static int partition(int [] A, int p, int r) {
int x = A[r];
int index = p - 1;
for (int i = p; i < r; i++) {
if (A[i] <= x) {
index++;
int temp = A[i];
A[i] = A[index];
A[index] = temp;
}
}
A[r] = A[index + 1];
A[index + 1] = x;
return index + 1;
}
}