快速排序
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) 收藏 举报
浙公网安备 33010602011771号