快速排序

来源:互联网 发布:哪款学英语软件好 编辑:程序博客网 时间:2024/05/16 15:07
#include <iostream>using namespace std;#define N 10int a[N] = {3,6,9,1,2,5,7,4,0,8};void quick(int left, int right){int sign = a[left];int i = left;int j = right;if(left > right)return ;while (i != j){while (i < j && sign <= a[j])//从右往开始找到此时数组中比第一个数小的位置的坐标jj--;while (i < j && sign >= a[i])//从左往开始找到此时数组中比第一个数大的位置的坐标ii++;if (i < j)//将i和j对应数组的数值交换{int tmp = a[i];a[i] = a[j];a[j] = tmp;}}//以上while循环结束后,得到他们的交遇点iint tmp1 = a[i];//将此时数组的第一个数和交遇点i对应数组的数值交换a[i] = a[left];     a[left] = tmp1;     quick(left,i-1); //将此时数交遇点i-1之前数组进行排序    quick(i+1,right);//将此时数交遇点i+1之后数组进行排序}int main(){for (int i =0; i < N; i++)cout<<a[i]<< "  ";cout<<endl;quick(0, N-1);for (i =0; i < N; i++)cout<<a[i]<< "  ";cout<<endl;return 0;}


快速排序的解题思路

先从数组右边开始往左找到比第一个数小的做标记

然后从数组左边开始往右找到比第一个数大的做标记

之后交换这俩个数

继续从标志往左搜索,再从标志往右搜索,

如果标志和标志未相遇,继续重复以上步骤

 

直到标志和标志到达同样位置

首地址和标志交换

 

以标志为中心,分开成两个部分,分别处理,也就说两个数组分别重复以上步骤





0 0
原创粉丝点击