快速排序

  1 #include <stdio.h>
  2 #include<stdlib.h>
  3 
  4 void swap(int * pi, int *pj)//交换
  5 {
  6     int temp = *pi;
  7     *pi = *pj;
  8     *pj = temp;
  9 }
 10 void   show(int *p, int n)//显示数组状态
 11 {
 12     printf("\n此时状态  ");
 13     for (int i = 0; i < n; i++)
 14     {
 15         printf("%4d", p[i]);
 16     }
 17 
 18 }
 19 
 20 
 21 void  quick(int *arr, int iLeft, int iRight)
 22 {
 23     int i = iLeft;//从左边开始  0
 24     int j = iRight + 1;// 从右边开始循环
 25     if (i < j)
 26     {
 27         do
 28         {
 29 
 30             ///int num[10] = { 10, 9, 20, 19, 13, 8, 9, 22, 0, 91 };
 31             do
 32             {
 33                 i++;
 34 
 35             } while (arr[i] <= arr[iLeft] && i <= iRight);
 36             //最靠近右边的一个小于等于他的数
 37 
 38             do
 39             {
 40                 j--;
 41 
 42             } while (arr[j] >= arr[iLeft] && j> iLeft);
 43             //最靠近左边大于等于他的数
 44 
 45             if (i<j)
 46             {
 47 
 48                 swap(&arr[i], &arr[j]);//交换
 49             }
 50 
 51             show(arr, 10);
 52 
 53         } while (i<j);
 54 
 55         swap(&arr[iLeft], &arr[j]);//交换
 56     //    show(arr, 10);
 57 
 58         quick(arr, iLeft, j - 1);//分割左边
 59         quick(arr, j + 1, iRight);//分割右边
 60 
 61     }
 62 
 63 }
 64 
 65 
 66 void main()
 67 {
 68     int num[10] = { 10, 9, 20, 19, 13, 8, 9, 22, 0, 91 };
 69 
 70     quick(num, 0, 10 - 1);
 71 
 72     show(num, 10);
 73 
 74     system("pause");
 75 }
 76 
 77 /////////////////////////////////////////////////////////////////////////////
 78 
 79 void sort(int *a, int left, int right)
 80 {
 81     if (left >= right)/*如果左边的数组大于或者等于就代表已经整理完成一个组了*/
 82     {
 83         return;
 84     }
 85     int i = left;
 86     int j = right;
 87     int key = a[left];
 88 
 89     while (i < j)                               /*控制在当组内寻找一遍*/
 90     {
 91         while (i < j && key <= a[j])
 92             /*而寻找结束的条件就是,1,找到一个小余或者大于key的数(大小取决于你想升
 93             序还是降序)2,没有符合的切i与j相遇*/
 94         {
 95             j--;/*向前寻找*/
 96         }
 97 
 98         a[i] = a[j];
 99         /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
100         a[0],那么就是给key)*/
101 
102         while (i < j && key >= a[i])
103             /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
104             因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
105         {
106             i++;
107         }
108 
109         a[j] = a[i];
110     }
111 
112     a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
113     sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
114     sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
115     /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
116 }

 

posted on 2015-06-20 07:49  Dragon-wuxl  阅读(167)  评论(0)    收藏  举报

导航