快速排序代码实现

代码如下:

 1 #include<stdio.h>
 2 //快速排序函数,形参列表为数组,左指针位置,右指针位置,int *arr等价于int arr[]
 3 void QkSort(int *arr, int left, int right){
 4     if (left > right)  //左指针位置必须大于右指针位置
 5     {
 6         return;
 7     }
 8     //变量tmp为基准数,在此规定基准数为序列的第一个数,即左指针指向的数
 9     int tmp = arr[left];
10     int i = left; //左指针
11     int j = right;   //右指针
12     //外循环,直到左指针和右指针相等时退出,表示根据当前基准数以完成当前序列排序
13     while (i != j)
14     {   //内循环1,寻找到比基准数小的数时退出循环,此循环控制右指针
15         while (arr[j] >= tmp && j > i)
16         {
17             j--;
18         }
19         //内循环2,寻找到比基准数大的数时退出循环,此循环控制左指针
20         while (arr[i] <= tmp && j > i)
21         {
22             i++;
23         }
24         //经过以上两个内循环后,此时的左指针和右指针分别指向了
25         //比基准数小和比基准数大的数
26         //接下来要将这两个指针的数据进行交换
27         if (j > i)//交换前判断右指针是否大于左指针
28         {
29             int t = arr[i];
30             arr[i] = arr[j];
31             arr[j] = t;
32         }
33     }//外循环尾
34 
35     //执行完循环后,就找到了基准数的排序位置,将基准数tmp与i位置进行交换
36     arr[left] = arr[i];
37     arr[i] = tmp;
38     //*********************************************
39     //下面的程序为递归,可能存在多层递归调用
40     //*********************************************
41     //此时的数组分为了两部分,基准数左边都是小于基准数的,右边都是大于基准数的,
42     //现在进行递归,对基准数左边的数进行排序,此时递归可能会有多层
43     QkSort(arr, left, i - 1);
44     //进行到这步时,基准数左边已经全部有序,而右边还未进行排序,
45     //现在进行递归,对基准数右边的数据进行排序,此时递归可能有多层
46     QkSort(arr, i + 1, right);
47 }
48 
49 int main()
50 {
51     int arr[] = { 0, 4, 3, 5, 65, 2, 64, 68, 34, 94, 53, 74, 13 };
52     int len = sizeof(arr)/sizeof(int);
53     printf("待排序数值:  ");
54     for (int i = 0; i <=len-1; i++)
55     {
56         printf("%d ",arr[i]);
57     }
58     printf("\n");
59     printf("排序后的数值:");
60     QkSort(arr,0,len-1);//调用快速排序函数
61     for (int i = 0; i <=len-1; i++)
62     {
63         printf("%d ", arr[i]);
64     }
65         printf("\n");
66 }

最终实现结果:

 

简化code,去除注释,快速排序算法,如下:

 1 void QkSort(int *arr, int left, int right){
 2     if (left > right)
 3     {
 4         return;
 5     }
 6     unsigned int loopNo = 0;
 7     int tmp = arr[left];
 8     int i = left;
 9     int j = right;
10     while (i != j)
11     {
12         while (arr[j] >= tmp && j > i)
13         {
14             j--;
15         }
16         while (arr[i] <= tmp && j > i)
17         {
18             i++;
19         }
20         if (j > i)
21         {
22             int t = arr[i];
23             arr[i] = arr[j];
24             arr[j] = t;
25         }
26 
27     }
28     arr[left] = arr[i];
29     arr[i] = tmp;
30     QkSort(arr, left, i - 1);
31     QkSort(arr, i + 1, right);
32 }

 

posted @ 2024-05-16 09:27  昆山皮皮虾  阅读(3)  评论(0编辑  收藏  举报