C++ 快速排序、去重
快速排序的C++代码及详细注释如下
欢迎交流
运用分治的思想 将问题分为多个子问题
运用递归的方法
细节见注释
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79#include<iostream> using namespace std; //交换函数 template<typename T> void swa(T&a,T&b) { T temp=a; a=b; b=temp; return; } //快排 分治思想 template<typename T> void quick(T*a,int start,int end) { if(start>=end) return; T mid=a[end];//选数组最后一个数作为参照 int left=start;//实参start作为左端 int right=end-1;//实参end-1作为右端 while(left<right)//遍历 { while(a[left]<=mid&&left<right)//保证比mid值小的在左端 { left++; } while(a[right]>=mid&&left<right)//比mid值大的在右端 { right--; } swa(a[left],a[right]);//当上述两个while循环结束时,说明left==right 或者left的当前值比mid大,right的当前值比mid小,不论怎样 我们做一次交换 就能保住比mid小的任然在左边 大的任然在左边 } if(a[left]>=a[end])//left==right时 找到mid位置 这时比较left和end end小的话则交换 swa(a[left],a[end]); else left++;//end大的情况说明情况比较极端 说明end值为当前序列最大值 故让left自增1 quick(a,start,left-1);//递归 quick(a,left+1,end);//递归 } template<typename T> int delsame(T*a,int length) { T temp; temp=a[0];//作为当前需要比较的中间值 int k=1; for(int i=1;i<length;i++) { if(a[i]!=temp) { a[k]=a[i];//覆盖 k++;//下标自增 temp=a[i];//更新中间值 } } return k;//返回覆盖后 去重后的长度 } int main() { int n; cout<<"输入需要排序的数列大小:"; cin>>n; int *a=new int[n]; cout<<"输入需要排序数列:"; for(int i=0;i<n;i++) { cin>>a[i]; } quick(a,0,n-1); cout<<"排序后的数列为:"; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; int k=delsame(a,n); cout<<"去重后数列为:"; for(int i=0;i<k;i++) cout<<a[i]<<" "; cout<<endl; return 0; }
复制代码
1
2
3
4
5输入需要排序的数列大小:10 输入需要排序数列:2 6 9 4 5 1 8 9 -7 8 排序后的数列为:-7 1 2 4 5 6 8 8 9 9 去重后数列为:-7 1 2 4 5 6 8 9
最后
以上就是愉快钢笔最近收集整理的关于C++ 快速排序、去重C++ 快速排序、去重的全部内容,更多相关C++内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复