标签:遍历 数据结构 oid pivot class mes col argc 打印数组
首先快速排序步骤:
#include<iostream> #include<vector> using namespace std; //不含暂存单元的数组v1 int temp1[]={59,20,17,36,98,14,23,83,13,28}; vector<int> v1(begin(temp1),end(temp1)); //打印数组 inline void printV(const vector<int> &v) { for(auto a:v) cout<<a<<" "; cout<<endl; } //第一次划分 //快速排序第一次划分 int Partition(vector<int> &v,int first,int end) { int i=first; int j=end; printV(v); cout<<"此时i="<<i<<" 此时j="<<j<<" "; while(i<j) { while(i<j&&v[i]<v[j]) {j--; cout<<"此时i="<<i<<" 此时j="<<j<<endl;} if(i<j)//假如i<j 交换ij { cout<<"交换"<<" "; int temp=v[j]; v[j]=v[i]; v[i]=temp; i++; printV(v); cout<<"此时i="<<i<<" 此时j="<<j<<" "; } cout<<endl; while(i<j&&v[i]<=v[j]) { i++; cout<<"此时i="<<i<<" 此时j="<<j<<endl;} if(i<j) { cout<<"交换"<<" "; int temp=v[j]; v[j]=v[i]; v[i]=temp; j--; printV(v); cout<<"此时i="<<i<<" 此时j="<<j<<" "; } } printV(v); return i; } //这里我们先直接调用一次划分理解下如何划分的 int main(int argc, char *argv[]) { Partition(v1,0,v1.size()-1); return 0; }
然后上运行截图分析
接下来就是完整的包含递归的快排了
先上代码
#include<iostream> #include<vector> using namespace std; //不含暂存单元的数组v1 int temp1[]={59,20,17,36,98,14,23,83,13,28}; vector<int> v1(begin(temp1),end(temp1)); //打印数组 inline void printV(const vector<int> &v) { for(auto a:v) cout<<a<<" "; cout<<endl; } //快速排序一次划分 int Partition(vector<int> &v,int first,int end) { int i=first; int j=end; printV(v); cout<<"此时i="<<i<<" 此时j="<<j<<" "; while(i<j) { while(i<j&&v[i]<v[j]) {j--; cout<<"此时i="<<i<<" 此时j="<<j<<endl;} if(i<j)//假如i<j 交换ij { cout<<"交换"<<" "; int temp=v[j]; v[j]=v[i]; v[i]=temp; i++; printV(v); cout<<"此时i="<<i<<" 此时j="<<j<<" "; } cout<<endl; while(i<j&&v[i]<=v[j]) { i++; cout<<"此时i="<<i<<" 此时j="<<j<<endl;} if(i<j) { cout<<"交换"<<" "; int temp=v[j]; v[j]=v[i]; v[i]=temp; j--; printV(v); cout<<"此时i="<<i<<" 此时j="<<j<<" "; } } printV(v); cout<<"一次part结束"<<endl; return i; } //快排 void QuickSort(vector<int> &v,int first,int end) { if(first<end) { int pivot=Partition(v,first,end); QuickSort(v,first,pivot-1);; QuickSort(v,pivot+1,end); } } int main(int argc, char *argv[]) { QuickSort(v1,0,v1.size()-1); return 0; }
这是不停的对左侧左侧左侧的递归
这是不停的对右侧右侧递归。由于右侧数字很少,递归也很快结束了。
标签:遍历 数据结构 oid pivot class mes col argc 打印数组
原文地址:https://www.cnblogs.com/DJC-BLOG/p/9069400.html