快速排序的实现
2017-02-11 10:43
148 查看
前后对比
原
#include <iostream> #include <vector> #include <cstdbool> using namespace std; bool SwitchInt (int& a, int &b){ if (a == b) return true; a += b; b = a - b; a -= b; return true; } bool QuickSort (vector<int> &ivec, vector<int>::iterator small, vector<int>::iterator big){ if (small == big) return true; vector<int>::iterator start = small; vector<int>::iterator end = big; vector<int>::iterator flag = small; while (small != big){ if (*small > *flag){ SwitchInt(*small, *flag); flag = small; small++; continue; } if (*big < *flag){ SwitchInt(*big, *flag); flag = big; big--; continue; } } QuickSort(ivec, start, small); QuickSort(ivec, big, end); return true; } int main (void 4000 ){ vector<int> ivec; int num = 0; while (cin >> num){ ivec.push_back(num);} QuickSort(ivec, ivec.begin(), ivec.end()); for (int num: ivec) cout << num; return 0; }
现
// // bool SwitchInt (int& a, int &b){ // if (a == b) return true; // a += b; // b = a - b; // a -= b; // return true; // } // 标准SWAP方法, 比上面的更快 #include <vector> #include <iostream> #include <ctime> #include <cstdlib> #include <algorithm> using namespace std; void SwitchInt (int& a, int &b){ int t =a; a=b; b=t; } // vector<int> &ivec 参数无用,去掉 // bool 返回值无用,去掉 // big 使用标准库end语法 /*bool*/ void QuickSort (/*vector<int> &ivec,*/ vector<int>::iterator small, vector<int>::iterator big) { if (small == big) return /*true*/; vector<int>::iterator start = small; vector<int>::iterator end = big; vector<int>::iterator flag = small; //随机选取flag, 将小于等于此值的放在左边,大于此值的放于右边 for (small++; small != big; small++){ if (*small <= *flag){ SwitchInt(*small, *flag); //此时small的值为flag,需要前移的较小值已经移动完毕,flag指向其 flag++; SwitchInt(*small, *flag); //把位于samll位置的flag换回来,并将最前面一个大于flag的值换到small上 // flag = small; // small++; // continue; } // if (*big < *flag){ // SwitchInt(*big, *flag); // flag = big; // big--; // continue; // } } cout << &*start << ' ' << &*flag << ' ' << '\n'; //QuickSort(/*ivec,*/ start, small); QuickSort(/*ivec,*/ start, flag); // QuickSort(/*ivec,*/ big, end); QuickSort(/*ivec,*/ ++flag, end); return /*true*/; } int main(void) { srand(time(0)); vector<int> ivec; int num = 0; // while (cin >> num){ // ivec.push_back(num);} for (int n=0; n<10; n++) { cout << (num = rand()) << " "; ivec.push_back(num); } cout << "\n"; QuickSort(/*ivec,*/ ivec.begin(), ivec.end()); for_each(ivec.begin(), ivec.end(), [](int num){ cout << num << " ";}); system("pause"); return 0; }
总结
我以前使用vector和数组的时候可能有一个奇怪的习惯,不知道其他人有没有:函数调用数组/vector时会把这个数组/vector传入进去。这样虽然可以获得更为完整的信息,但是并没有这个必要,反而会降低程序的安全性。以前我在有闲心的时候会在函数定义的时候加上const来防止发生一些奇怪的事情,然而并没有这个必要,其实只需要把数组/vector的头和尾元素传入进去就好了,在这个程序里就显得尤为明显。我有的时候在思考一些问题的时候确实有些思维僵化了,如上面网友给出的修改建议:交换需要交换的元素后flag后移,然后再交换flag和small。虽然会改变一趟快排中较大元素的排列,但是并不影响该算法的结果。而之前我的想法有些混乱,由课本上的算法(数据结构)和我自己的想法混合而成,然而并没有能够很好的结合起来,导致原QuickSort中的逻辑混乱。这可能需要较多的练习才能改正过来
相关文章推荐
- 原创:快速排序的实现
- 快速排序的C#实现以及,算法导论上之后一个习题的思考
- List 采用delegate快速实现排序、查找等操作
- 快速排序分析与C语言实现
- Java下实现快速排序
- 递归实现快速排序
- 快速排序方法Java实现与分析
- 快速排序的JAVA实现
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 快速排序Java实现
- 分治法:用C#实现快速排序
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- vb应用--快速排序-法实现二维数组的指定列排序
- List<T>采用delegate快速实现排序、查找等操作
- 排序算法复习(Java实现)(二): 插入,冒泡,选择,Shell,快速排序
- 快速排序的两种实现
- 快速排序及代码实现
- java实现的冒泡、选择、快速排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 快速排序---c#实现