快速排序

成绩 10 开启时间 2017年11月22日 星期三 10:00
折扣 0.8 折扣时间 2017年12月15日 星期五 23:55
允许迟交 关闭时间 2018年01月8日 星期一 23:55

要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。

 注:1,cutoff值为5,不足cutoff使用插入排序。

        2,输入、输出格式参见测试用例0。

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 41↵
  2. 17↵
  3. 34↵
  4. 0↵
  5. 19↵
  6. #↵
以文本方式显示
  1. After Sorting:↵
  2. 0 17 19 34 41 ↵
  3. Median3 Value:↵
  4. none↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 61↵
  2. 59↵
  3. 82↵
  4. -10↵
  5. 31↵
  6. -2↵
  7. -3↵
  8. 10↵
  9. 2↵
  10. 108↵
  11. 12↵
  12. 80↵
  13. -21↵
  14. 127↵
  15. 12↵
  16. #↵
以文本方式显示
  1. After Sorting:↵
  2. -21 -10 -3 -2 2 10 12 12 31 59 61 80 82 108 127 ↵
  3. Median3 Value:↵
  4. 12 -3 61 ↵
1秒 64M 0

#include<stdio.h> 
#define Cutoff 5 
int a[1000]; 
int num[1000]; 
int y; 
 
void Swap(int *a, int *b) 
{ 
   int tmp = *a; 
  *a = *b; 
   *b = tmp; 
} 
 
 
int Median3(int A[], int Left, int Right) 
{ 
  int Center = (Left + Right) / 2; 
 
  if (A[Left] > A[Center]) 
        Swap(&A[Left], &A[Center]); 
    if (A[Left] > A[Right]) 
     Swap(&A[Left], &A[Right]); 
 if (A[Center] > A[Right]) 
       Swap(&A[Right], &A[Center]); 
 
  Swap(&A[Center], &A[Right - 1]); 
   a[y++] = A[Right - 1]; 
 return A[Right - 1]; 
} 
void Insertation(int A[], int N) 
{ 
  int j, p; 
 
 int tmp; 
   for (p = 1; p < N; p++) 
 { 
      tmp = A[p]; 
        for (j = p; j>0 && A[j - 1] > tmp; j--) 
          A[j] = A[j - 1]; 
       A[j] = tmp; 
    } 
} 
void Qsort(int A[],int Left,int Right) 
{ 
   int i, j; 
  int Pivot; 
 
    if (Left + Cutoff <= Right) 
 { 
      Pivot = Median3(A, Left, Right); 
       i = Left; j = Right - 1; 
       for (;;) 
       { 
          while (A[++i] < Pivot){} 
            while (A[--j] > Pivot){} 
            if (i < j) 
              Swap(&A[i], &A[j]); 
            else 
               break; 
     } 
      Swap(&A[i], &A[Right - 1]); 
 
       Qsort(A, Left, i - 1); 
     Qsort(A, i + 1, Right); 
    } 
  else 
       Insertation(A + Left, Right - Left + 1); 
} 
 
 
 
int main() 
{ 
 //freopen("1.txt", "r", stdin); 
    int i = 0; int value; int j = 0; int k = 0; 
    while (scanf("%d",&value)) 
 { 
      if (value == '#') 
          break; 
     num[i] = value; 
        i++; 
   } 
  if (i > Cutoff) 
     Qsort(num, 0, i - 1); 
  else 
       Insertation(num, i); 
   printf("After Sorting:\n"); 
    while (j<i) 
 { 
      printf("%d ", num[j]); 
     j++; 
   } 
  printf("\nMedian3 Value:\n"); 
  if (y>0) 
    { 
      while (k < y) 
       { 
          printf("%d ", a[k++]); 
     } 
      printf("\n"); 
  } 
  else 
       printf("none\n"); 
  return 0; 
}  


快速排序算法(C语言版) #include <stdio.h> #include "type.h" #define Q_SIZE 10 /************************************* 模块内部数组或变量定义 **************************************/ static UINT8 q_array[Q_SIZE] = {0}; //static UINT8 m_array_tmp[M_SIZE] = {0}; /* 辅助数组,存放排序的中间结果 */ /************************************* 函数定义 **************************************/ /******************************************************************************************* 函数名:UINT8 splt( UINT8 * m_ptr, UINT8 q_low, UINT8 q_high, UINT8 q_pos ) 入口参数列表:m_ptr, q_pos 入口参数描述:数组的地址,数组的首元素和尾元素位置,指向主元位置的指针 返回值描述:无 函数功能:使数组经过排列后小于或等于x的元素在x前面,x在大于它的元素前面(x = q_array[*q_pos]) ********************************************************************************************/ UINT8 splt( UINT8 * q_ptr, SINT8 q_low, SINT8 q_high ) { UINT8 x = 0; SINT8 i = 0; SINT8 j = 0; UINT8 q_tmp = 0; i = q_low; x = q_ptr[q_low]; for (j = q_low + 1; j <= q_high; j++) { if (q_ptr[j] <= x) { i++; if (i != j) { q_tmp = q_ptr[i]; q_ptr[i] = q_ptr[j]; q_ptr[j] = q_tmp; } } } q_tmp = q_ptr[i]; q_ptr[i] = q_ptr[q_low]; q_ptr[q_low] = q_tmp; return i; } /******************************************************************************************* 函数名:void quicksort( UINT8 * m_ptr, UINT8 m_low, UINT8 m_high ) 入口参数列表:m_ptr, m_low, m_high 入口参数描述:数组的地址,数组的首元素和尾元素的索引 返回值描述:无 函数功能:对数组进行排序,产生非降序的数组 ********************************************************************************************/ void quicksort( UINT8 * q_ptr, SINT8 q_low, SINT8 q_high ) { UINT8 q_w; if (q_low < q_high) { q_w = splt(q_ptr, q_low, q_high); quicksort(q_ptr, q_low, q_w - 1); quicksort(q_ptr, q_w + 1, q_high); } } /****************************************************************************** 函数名:main( void ) 入口参数列表:无 入口参数描述:无 返回值描述:无 函数功能:主函数,用于测试 *******************************************************************************/ void main( void ) { UINT8 i, q_num = 0; printf("请输入10个2位整数:\n"); for (i = 0; i < Q_SIZE; i++) { scanf("%d", &q_num); q_array[i] = q_num; } quicksort(q_array, 0, 9); for (i = 0; i < Q_SIZE; i++) { printf("%d ", q_array[i]); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值