一、快速算法核心
void quick_sort(int* src,int left,int right)
{
int i=left,j=right;
int tmp = 0;
if(NULL == src)
{
printf("Func:%s Input Err:src=%s\n\r",src);
return ;
}
/* 递归结束条件 */
if(left >= right)
{
return;
}
tmp = src[left];
while(i<j)
{
while(i<j && tmp <= src[j])
j--;
if(i<j)
src[i] = src[j];
while(i<j && tmp >= src[i])
i++;
if(i<j)
src[j] = src[i];
}
src[i] = tmp;
quick_sort(src,left,i-1);
quick_sort(src,i+1,right);
}
二、快速排序可执行C程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int** quick_point = NULL;
int quick_length = 0;
void quick_sort(int* src,int left,int right)
{
static int qp=1;
int i=left,j=right;
int tmp = 0;
int* record_point = NULL;
if(NULL == src)
{
printf("Func:%s Input Err:src=%s\n\r",src);
return ;
}
/* 递归结束条件 */
if(left >= right)
{
return;
}
tmp = src[left];
while(i<j)
{
while(i<j && tmp <= src[j])
j--;
if(i<j)
src[i] = src[j];
while(i<j && tmp >= src[i])
i++;
if(i<j)
src[j] = src[i];
}
src[i] = tmp;
/* 一趟排序完成,记录一下 */
record_point = malloc(sizeof(int)*quick_length);
if(NULL == record_point)
printf("Func:%s Malloc Failed!\n",__FUNCTION__);
else
{
memcpy(record_point,src,sizeof(int)*quick_length);
quick_point[qp]=record_point;
if(quick_length > qp)
qp++;
else
printf("记录数组溢出!!qp=%d quick_length=%d\n",qp,quick_length);
}
quick_sort(src,left,i-1);
quick_sort(src,i+1,right);
}
void printf_str(int *src,int length)
{
int i=0;
if(NULL == src || 0 == length)
{
printf("Func:%s Input Err:src=%d length=%d\n\r",src,length);
return ;
}
printf("数组元素:");
for(i=0;i<length;i++)
{
printf(" %2d",src[i]);
}
printf("\n\r");
}
void quick_sort_function(int* src,int length)
{
int i = 0;
int record_err = 0;
int* record_point = NULL;
if(NULL == src || 0 == length)
{
printf("Func:%s Input Err,src=%s length=%d\n",__FUNCTION__,src,length);
return ;
}
quick_point = (int**)malloc(sizeof(int*)*length);
if(NULL == quick_point)
{
printf("Func:%s Malloc Failed!\n\r",__FUNCTION__);
record_err = 1;
}
else
memset(quick_point,0,sizeof(int*)*length);
quick_point[0] = (int*)malloc(sizeof(int)*length);
if(NULL != quick_point[0])
{
memcpy(quick_point[0],src,sizeof(int)*length);
}
else
printf("Func:%s,Malloc Failed!\n",__FUNCTION__);
quick_length = length;
printf("***快速排序算法示例***\n初始");
printf_str(src,length);
printf("共有%d个元素,开始排序...\n",length);
quick_sort(src,0,length-1);
printf("排序后:");
printf_str(src,length);
printf("排序过程详解:\n");
printf("*原始数组:");
printf_str(quick_point[0],length);
free(quick_point[0]);
for(i=1;i<length;i++)
{
if(NULL != quick_point[i])
{
printf("第%d次排序:",i);
printf_str(quick_point[i],length);
if(NULL != quick_point[i])
{
free(quick_point[i]);
quick_point[i] = NULL;
}
}
}
if(NULL != quick_point)
{
free(quick_point);
}
}
int main()
{
int src[]={32,46,12,33,47,53,14,11,9,6,15};
int tmp[]={23,21,19,18,17,15,13,3,2,0};
quick_sort_function(src,sizeof(src)/sizeof(int));
//quick_sort_function(tmp,sizeof(tmp)/sizeof(int));
return 0;
}
三、快速排序结果及分析
3.1、混合顺序的数组排序
3.2、降序的数组排序