王道考研 ++++ 快速排序

#include <stdio.h>
#include <stdlib.h>
int i = 0;
void swap(int *a,int *b);
int getpivot(int *list,int L,int R);
int* quicksort(int *list,int L,int R,int size);
void swap(int *a,int *b)
{
  int temp = *a;
  *a = *b;
  *b = temp;
}
/*获取中间值pivot*/
int getpivot(int *list,int L,int R)
{
  int mid = (L+R) / 2;
  if(list[L] > list[mid])swap(&list[L],&list[mid]);
  if(list[L] > list[R])swap(&list[L],&list[R]);
  if(list[mid] > list[R])swap(&list[mid],&list[R]);

  swap(&list[mid],&list[R]);
  return list[R];
}
/*快速排序*/
int* quicksort(int *list,int L,int R,int size)
{
  int low,high,pivot,j;
  if(L < R)
  {
    pivot = getpivot(list,L,R);
    low = L-1,high = R;//目标排序序列是 0 - size-2
    while (1)
    {
      while (list[++low] < pivot);
      while (list[--high] > pivot);//寻找左边大于pivot的右面小于pivot的
      if(low < high)swap(&list[low],&list[high]);//在正常范围内 把左大右小交换
      else break;
    }
    swap(&list[low],&list[R]);//将pivot放到正确的位置
    printf("第%d趟结果:",++i);
    for(j = 0;j < size;j++)
        printf("%d%c",list[j]," \n"[j == size-1]);
    quicksort(list,L,low-1,size);//将pivot前面的排序
    quicksort(list,low+1,R,size);//。。。后面排序
  }
  return list;
}
int main(int argc, char const *argv[]) {
  int size,*list,i;
  printf("请输入数组大小:");
  scanf("%d",&size);
  list = (int*)malloc(sizeof(int)*(size+1));
  printf("请输入%d个元素:\n",size);
  for(i = 0;i < size;i++)
      scanf("%d",&list[i]);
  list = quicksort(list,0,size-1,size);
  return 0;
}

发布了85 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/WX_1218639030/article/details/100151398