设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
每一趟快速排序都把数组分成两部分,然后分别对前后两部分,在进行快速排序,这是一个递归的过程,直到子序列个数为1为止。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef char InfoType;
typedef struct Sz
{
int key;
InfoType *info;
}Sz;
typedef struct SQ//定义一个顺序线性表
{
Sz *R;
int length;
}SqList;
int Init_SqList(SqList *L)//顺序线性表初始化
{
L->R=(Sz *)malloc((MAX_SIZE + 1) * sizeof(Sz)) ;
if(!L->R)
return 0;
else
{
L->length = 0;
return 1;
}
}
一趟快速排序
//一趟快速排序算法
int quick_one_pass(SqList *L , int low, int high)
{
int i = low;
int j = high;
L->R[0] = L->R[i];/*R[0]作为临时单元和哨兵*/
do
{
while ((L->R[0].key < L->R[j].key)&&(j > i))
j--;
if(j>i)
{
L->R[i]=L->R[j] ; i++;
}
while((L->R[i].key < L->R[0].key)&&(j > i))
i++;
if(j>i)
{
L->R[j] = L->R[i];
j--;
}
} while(i != j);/*i=j时退出扫描*/
L->R[i] = L->R[0];
return(i);
}
递归调用一趟快速排序的算法
//快速排序(递归)
void quick_Sort(SqList *L, int low, int high)
{ //low、high是每部分的起始位置和终端位置
int k;
if(low < high)
{
k = quick_one_pass(L, low, high);
quick_Sort(L, low, k-1);
quick_Sort(L, k+1, high);
}/*序列分为两部分后,分别对每个子序列快速排序*/
}
main方法
int main()
{
int i;
int num;
SqList L;
Init_SqList(&L);
/*输入排序码*/
printf("please enter the number of the data:");
scanf("%d", &num);
for(i = 1; i < num + 1; i++){
int values;
printf("please enter the %d data:", i);
scanf("%d", &values);
L.R[i].key = values;
L.length++;
}
for(i = 1; i <= L.length; i++)
{
printf("%d ", L.R[i].key);
}
printf("\n");
printf("-----------------------------\n");
/*快速排序*/
quick_Sort(&L, 1, num);
for(i = 1; i <= L.length; i++)
{
printf("%d ", L.R[i].key);
}
printf("\n");
return 0;
}
例:
运行结果: