快速排序


快速排序原理:
       0    1   2    3   4    5    6     7
data   28   4   36   2   65   14   55    17
       Piv      i                         j
       left                             right

left.right 排序范围

Pivot为每次范围内的最左边数, data[left]
i = left;
j = right+1;


1.从i+1位置往右寻找比Pivot大的数,得到索引i

2.从 j-1位置往左寻找比Pivot小的数,得到索引j

以上两个条件都严格边界,否则会产生无效运算

3.
如果i < j

    data[i],data[j]交换

如果i < j,跳到第1步

4.
如果 i>= j 并且j != left

   data[k],data[j]交换

到这步就产生了以Pivot为分界的两段数据,递归对两端数据进行1-4步运算

比如:

初始i = 0;j=8;

       0    1   2    3   4    5    6     7    8
data   28   4   36   2   65   14   55    17
       Piv      i                             j
       left                             right

第一趟
(1)
i = 2;
j = 7;
i < j,交换
       0    1   2    3   4    5    6     7
data   28   4   17   2   65   14   55    36
       Piv      i                         j
       left                             right
(2)
从i=3开始继续找>Pivot的数
       0    1   2    3   4    5    6     7
data   28   4   17   2   65   14   55    36
       Piv               i     j         
       left                             right
j=6开始继续找<Pivot的数

i = 4
j = 5
i< j,交换
       0    1   2    3   4    5    6     7
data   28   4   17   2   14   65   55    36
       Piv                              
       left                             right
(3)
从i = 5, j = 4开始继续找
       0    1   2    3   4    5    6     7
data   28   4   17   2   14   65   55    36
       Piv           j              i          
       left                             right

i = 6
j = 4
i > j
把28换到j位置
       0    1   2    3   4    5    6     7
data   14   4   17   2   28   65   55    36
       Piv                j         i          
       left                             right

现在分成两段

[14 4 17 2] 28 [65 55 36]
递归下去,退出条件是left < right
  1. void Output(int array[], int n)
  2. {
  3.     printf("%d:/t/t ", count++);
  4.     for (int i=0; i<n; i++)
  5.     {
  6.         printf("%d ", array[i]);
  7.     }
  8.     printf("/n");
  9. }
  10. void swap(int &a, int &b)
  11. {
  12.     printf("%d <- -> %d/n", a, b);
  13.     int temp;
  14.     temp = b;
  15.     b = a;
  16.     a = temp;
  17. }
  18. void QuickSort(int array[], int n, int left, int  right)
  19. {
  20.     int Pivot = array[left];
  21.     int i = left;
  22.     int j = right+1;
  23.     if (left < right)
  24.     {
  25.         printf("new turn/n");
  26.         while (i < j)
  27.         {
  28.             // 从+1位置找比Pivot大的
  29.             do
  30.             {
  31.                 i++;
  32.                 printf("i = %d/n", i);
  33.             }while (array[i] <= Pivot && i < right);
  34.             // 从最右边位置找比Pivot小的  
  35.             do
  36.             {
  37.                 j--;
  38.                 printf("j = %d/n", j);
  39.             }while (array[j] >= Pivot && j > left);
  40.                         
  41.             // i < j,调整左右两边
  42.             if (i < j)
  43.             {
  44.                 swap(array[i], array[j]);
  45.                 Output(array, n);
  46.             }
  47.         }
  48.         // i >=j 已经调整好,Pivot放置到中间值,如果j已经和left相等,那么不必再动位置了
  49.         if (i >= j && j != left)
  50.         {
  51.             swap(array[left], array[j]);
  52.             Output(array, n);
  53.         }
  54.         QuickSort(array, n, left, j-1);
  55.         QuickSort(array, n, j+1, right);
  56.     }
  57. }
为了消除冗余计算,每次取i++, j--可达到目的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值