快速排序算法

一、快速算法核心

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、降序的数组排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值