基本思想:
确定一个基准值,通过一趟排序将要排序的数据分割成独立的两部分,左边的数据比指定的值小,右边的数据比指定的值大,然后再对左右两边分别进行递归
C语言实现:
#include<stdio.h>
void print(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void QuickSort(int a[],int start,int end)
{
int i=start,j=end;
//选中第一个的值为start
int base=a[start];
int temp;
//递归的结束条件,如果i>=j;说明数组已经排好序了,直接返回
if(i>=j)
return ;
while(i<j)
{
//从后向前找出比基准值小的下标 [比基准值大就继续往前找]
for(;j>i&&a[j]>=base;j--);
//从前向后找出比基准值大的小标 [比基准值小就继续往后找]
for(;i<j&&a[i]<=base;i++);
//交换找到的值
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
//继续while循环
}
//i 的值就是最后的位置,将其与基准值进行
a[start]=a[i];
a[i]=base;
QuickSort(a,start,i-1);
QuickSort(a,i+1,end);
}
int main(void)
{
int a[10]={3,5,7,6,1,-9,-8,79,100,0};
print(a,10);
QuickSort(a,0,9);
print(a,10);
}
运行结果:
Java语言的实现;
public class QuickSort {
public static void main(String[] args) {
int[] a = {3, 5, 7, 6, 1, -9, -8, 79, 100, 0};
print(a);
QuickSort(a, 0, a.length - 1);
print(a);
}
public static void QuickSort(int[] a, int start, int end) {
int i=start,j=end;
int base=a[start];
int temp;
if(i>=j)
return;
while (i<j)
{
for(;j>i&&a[j]>=base;j--);
for(;i<j&&a[i]<=base;i++);
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
a[start]=a[i];
a[i]=base;
QuickSort(a,start,i-1);
QuickSort(a,i+1,end);
}
public static void print(int[] a) {
for (int i : a) {
System.out.print(i);
System.out.print(" ");
}
System.out.println();
}
}
运行结果: