C语言之——快速排序(图解)


C语言之--快速排序

纯属学习记录,仅供参考。

 

快速排序

快速排序:

(1)首先规定一个“基准”, 将数据分为两个部分。

(2)将大于等于(大于)的数据放在基准的右面,将小于(小于等于)的数据放在基准的左面。

(3)然后,左面的数据又可以规定一个基准,分为两部分;右面的数据也可以规定一个基准,也分为两部分。递归下去。

(4)直到分到不可再分,或数据有序。

如果右面找到一个小于基准的数,左面找到一个小于基准的数,而且左右没有相遇则交换左右数据。

如果左右相遇了,那么就把基准与相遇点数据交换。

自此,将序列分为左右两部分。左面的小于基准,右面的大于基准。

 

代码示例:

#include <stdio.h>
#include <string.h>

void QuickSort(char arry[], int L, int R);
  
void main(void)
{
     int i;
     char arry[8] = {5, 4, 9, 8, 7, 6, 2, 1};
     printf("原来顺序:\n");
     for (i = 0; i < sizeof (arry); i++)
     {
        printf("%d\t", arry[i]);
     }
     printf("\n");
     QuickSort(arry, 0, 7);
     printf("排序后:\n");
     for (i = 0; i < sizeof (arry); i++)
     {
        printf("%d\t", arry[i]);
     }
     printf("\n");
     return;
}

void QuickSort(char arry[], int L, int R)
{
     int left = L,right = R;
     int x;
     int Centor = 0,temp = 0;
     
      if (L > R)
     {
         return;
     }
     Centor = arry[L];//基准保存在Centor中
     while (left != right)//left 与 right 没有相遇 则继续循环交换
     {
         while (arry[right] >= Centor && left < right)//如果右面的数大于基准跳过,小于基准停止,
         {
             right--;
         }
         while (arry[left] <= Centor && left < right)//如果左面的数小于基准跳过,大于基准停止,
         {
             left++;
         }
         if (left < right)//如果left 与 right 没有相遇,则将 右面小于基准的数 与 左面大于基准的数交换
         {
             temp = arry[left];
             arry[left] = arry[right];
             arry[right] = temp;
         }
         //显示交换后的序列
         for (x = 0; x < 8; x++)
         {
            printf("%d\t", arry[x]);
         }
         printf("\n");
     }
     //如果left 与 right 相遇 则将基准以相遇的位置数据互换,至此 就将数据分为了左右两部分
     //左面的小于基准,右面的大于基准
     arry[L] = arry[left];
     arry[left] = Centor;
     //将左面的继续进行排序
     QuickSort(arry, L, left-1);
     //将右面的继续进行排序
     QuickSort(arry, right+1, R);
}

 

输出结果:

原来顺序:
5       4       9       8       7       6       2       1
5       4       1       8       7       6       2       9
5       4       1       2       7       6       8       9
5       4       1       2       7       6       8       9
2       1       4       5       7       6       8       9
2       1       4       5       7       6       8       9
1       2       4       5       7       6       8       9
1       2       4       5       6       7       8       9
排序后:
1       2       4       5       6       7       8       9

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM