快速排序法之一
来源:互联网 发布:抗日知乎 编辑:程序博客网 时间:2024/06/05 20:36
//mian vector<int> temp;vector<int> id;for(int r=0; r<10;r++){int t = rand()%100+1;//0~100temp.push_back(t);cout<<t<<" ";}cout<<endl;sortvect::quick_sort(temp,id);for(int r=0; r<10;r++){cout<<temp[r]<<" ";}cout<<endl;for(int r=0; r<10;r++){cout<<id[r]<<" ";}cout<<endl;
/* * sortvect.h * * Created on: 2013-5-12 * Author: yutian */#ifndef SORTVECT_H_#define SORTVECT_H_#include "iostream"#include <fstream>#include <algorithm>#include<io.h>#include<vector>#include<time.h>using namespace std;class sortvect{public:template <class T>//从小到大排序,id存放排序后的索引static vector<T> quick_sort(vector<T>& A, vector<int>& id);template <class T>static int partition(vector<T>& A,vector<int>& id, int left,int right);template <class T>static void QUICKSORT(vector<T>& A, vector<int>& id, int b, int e);template <class T>static void printv(vector<T> A);};/** * 从小到大 * 分解:数组A[n]被划分两个字数组A[0..q-1]和A[q+1..n],使得对于数组A[0..q-1]中的元素都小于等于A[q], A[q+1..n]中的元素都大于等于A[q]。此时A[q]就得排好序。解决:通过递归调用快速排序,对字数组A[0..q-1]和A[q+1..n]进行排序合并:因为两个字数组已经是就地排好序的了,整个数组已经排好序了。 */template<class T>inline vector<T> sortvect::quick_sort(vector<T>& A, vector<int>& id) {if(id.size()==0){for(int r=0; r<A.size(); r++){id.push_back(r);}}int s_left = 0;int s_right = A.size()-1;QUICKSORT(A, id, s_left, s_right);return A;}template<class T>inline int sortvect::partition(vector<T>& A, vector<int>& id, int b, int e) { int i, j, aim, tmpid; T tmp; i = b - 1; j = b; aim = e;//尾数作为比较对象 while( j <= e-1) { //i和j之间(不包括i,j执行比较判定)的数都比A[aim]大 if(A[j] <= A[aim]) { i ++; tmp = A[i]; A[i] = A[j]; A[j] = tmp; tmpid = id[i]; id[i] = id[j]; id[j] = tmpid; } j ++; } T t = A[aim]; A[e] = A[i+1]; A[i+1] = t; int tid = id[aim]; id[e] = id[i+1]; id[i+1] = tid; printv(A); printv(id); return i + 1;}template<class T>inline void sortvect::QUICKSORT(vector<T>& A, vector<int>& id, int b, int e) { int q; if(b < e) //当b==e时,只有一个元素,无需排序 { q = partition(A, id, b, e); //查找划分元素的位置 QUICKSORT(A, id, b, q-1); QUICKSORT(A, id, q+1, e); }}template<class T>inline void sortvect::printv(vector<T> A) {for(int r=0; r<A.size();r++){cout<<A[r]<<" ";}cout<<endl;}#endif /* SORTVECT_H_ */