Skip to content

Commit e1f087a

Browse files
authored
数据结构---快排
1 parent ead44b2 commit e1f087a

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed

QuickSort.txt

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <stack>
4+
using namespace std;
5+
6+
//左右指针
7+
int sort1(vector<int>& v,int left,int right)
8+
{
9+
int key = right;
10+
while(left < right)
11+
{
12+
//无论排升序还是降序都必须是左边先走
13+
//也就是说,关键码在右边就左边先走,关键码在左边右边先走
14+
//左边先走找大
15+
while(left < right && v[left] <= v[key])
16+
{
17+
left++;
18+
}
19+
//右边再走找小
20+
while(left < right && v[right] >= v[key])
21+
{
22+
right--;
23+
}
24+
//左右交换
25+
swap(v[left],v[right]);
26+
}
27+
//交换
28+
swap(v[right],v[key]);
29+
30+
return right;
31+
}
32+
33+
//前后指针
34+
int sort2(vector<int>& v,int left,int right)
35+
{
36+
//当cur小于key时prev++
37+
//当cur大于key时,prev不变
38+
//cur再次小于key时,cur和prev交换
39+
//实际上,也就是让prev始终指向大的的时候就交换
40+
41+
int cur = left;
42+
int prev = cur-1;
43+
44+
while(cur <= right)
45+
{
46+
if(v[cur] <= v[right] && ++prev != cur)
47+
{
48+
swap(v[prev],v[cur]);
49+
}
50+
cur++;
51+
}
52+
53+
return prev;
54+
}
55+
56+
//挖坑法
57+
int sort3(vector<int>& v,int left,int right)
58+
{
59+
int flag = v[right];
60+
while(left < right)
61+
{
62+
//左边走找比坑的位置大的元素
63+
while(left < right && v[left] <= flag)
64+
{
65+
left++;
66+
}
67+
//将左边的大值填到右边的小坑,左边形成新的坑
68+
v[right] = v[left];
69+
//右边走找比坑位置小的元素
70+
while(left < right && v[right] >= flag)
71+
{
72+
right--;
73+
}
74+
//将右边的小值填到左边的大坑
75+
v[left] = v[right];
76+
}
77+
78+
//将flag填到坑位置
79+
v[left] = flag;
80+
81+
return left;
82+
}
83+
84+
//递归实现
85+
void QuickSort(vector<int>& v,int left,int right)
86+
{
87+
//左右指针
88+
/*if(left >= right)
89+
return;
90+
int index = sort1(v,left,right);
91+
QuickSort(v,left,index-1);
92+
QuickSort(v,index+1,right);*/
93+
94+
//前后指针
95+
if(left >= right)
96+
return ;
97+
98+
/*int index = sort2(v,left,right);
99+
QuickSort(v,left,index-1);
100+
QuickSort(v,index+1,right);*/
101+
102+
int index = sort3(v,left,right);
103+
QuickSort(v,left,index-1);
104+
QuickSort(v,index+1,right);
105+
}
106+
107+
//非递归实现
108+
void QuickSort1(vector<int>& v)
109+
{
110+
//存储索引的栈
111+
stack<pair<int,int>> st;
112+
//begin和end入栈
113+
st.push(make_pair(0,v.size()-1));
114+
115+
//进行快排
116+
while(!st.empty())
117+
{
118+
pair<int,int> p = st.top();
119+
st.pop();
120+
int index = sort1(v,p.first,p.second);
121+
//左右部分索引继续入栈
122+
if(index - 1 > p.first)
123+
st.push(make_pair(p.first,index-1));
124+
if(index + 1 < p.second)
125+
st.push(make_pair(index+1,p.second));
126+
}
127+
}
128+
129+
int main()
130+
{
131+
vector<int> v(15);
132+
v = {1,9,2,4,0,6,8,2,5,3,4,6,8,34,25,8};
133+
134+
for(auto e:v)
135+
{
136+
cout<<e<<" ";
137+
}
138+
cout<<endl;
139+
140+
QuickSort(v,0,v.size()-1);
141+
for(auto e:v)
142+
{
143+
cout<<e<<" ";
144+
}
145+
cout<<endl;
146+
v = {1,9,2,4,0,6,8,2,5,3,4,6,8,34,25,8};
147+
148+
QuickSort1(v);
149+
for(auto e:v)
150+
{
151+
cout<<e<<" ";
152+
}
153+
cout<<endl;
154+
155+
return 0;
156+
}

0 commit comments

Comments
 (0)