快速排序
什么是快速排序?快速排序其实是一种排序方法。
其他不啰说;
基本原理:给出一堆无序的数,首先重这堆数值中一第一个数为标杆(其他数也可以不过为了方便编程就选着第一个数为标杆),标杆选出后,将这堆无序数分成两堆,比标杆小的分到一堆,比标杆大的分到另一堆,这样就有两堆数了。接着按照同样的方法为这两堆数进行快速排序。
写代码时第一步,找出标杆,以标杆为中心将比标杆小的数放到标杆右边,比标杆大的放到左边;在分别进入左右两边进行快排;
假如 start 为数组起点 end为数组终点 排序函数为sort();k 为标杆在数组中的下标;
(1)sort(start,end)
(2)sort(start,k-1)
(3)sort(k+1,end)
实例:
给出数组为 3 1 2 6 4
//快速 排序 //从一堆数中 那第一个数为标杆 把大于标杆的数放在标杆的左边, //把小于标杆的数放在标杆的右边。将数放好后分别进入左右子段 //进行下一轮的快排 直到子段长度为1; #include<iostream> using namespace std; const int maxn=10; int number[maxn]; int n; void sort(int start,int end) { if(start>=end) return; int i;//从右边移动 int j;//从左边移动 int k;//记录最后一个移动位置的数的位置; int mid;//标杆 i=start;//该段的第一位为标杆 把第一个位空出来 j=end; k=start; mid=number[start]; while(i<j)//当i》=j时找到标杆的位置 { for(j;j>i;j--) { if(number[j]<=mid) { number[i]=number[j];//从左边往右找 找到一个比mid小的数 将它搬到右边i的位置 k=j; break; } } for(i;i<=j;i++) { if(number[i]>mid) { number[j]=number[i];//从右边往左边找 找到一个比mid大的数 将它搬到j的位置; k=i; break; } } } number[k]=mid;//把mid移动到最后一个空位; sort(start,k-1);//进入右子段 进行快速排序 sort(k+1,end);//进入左子段 进行快速排序 } int main() { int n; while(scanf("%d",&n),n) { printf("请输入n个数 "); memset(number,0,sizeof(number)); int i; for(i=1;i<=n;i++) { scanf("%d",&number[i]); }//输入数据 sort(1,n); //进行快排 printf("排序后结果 "); for(i=1;i<=n;i++) { printf("%d ",number[i]); } printf(" "); } return 0; }