经典排序之 快速排序
想利用这一两天复习一下几个经典的排序算法,今天先来看一下快速排序:
我们知道快速排序的思想是:先找到一个枢轴,然后进行分块,将其中元素比枢轴小的元素放到枢轴左边,将比他大的放到他的右边,这样我们就完成了一遍基本排序。我们确定了一个数字在排好序的位置;之后利用递归再将枢轴左边的数据分块,将右边的数据分块即可;
算法实现:
1 #include<iostream> 2 using namespace std; 3 4 void swap( int &m, int &n){ 5 int temp = m; 6 m = n; 7 n = temp; 8 } 9 10 int Partition(int *data, int begin, int end){ //找到枢轴,然后将左右的数据分开 11 12 if(data == NULL || begin < 0 || end < 0){ 13 cout<<"the invalid array"<<endl; 14 } 15 16 int key = data[begin]; 17 int pos = begin; 18 19 for(int index = begin + 1; index < end; index++){ 20 if(data[index] <= key){ 21 ++pos; 22 swap(data[pos], data[index]); 23 } 24 } 25 26 swap(data[begin], data[pos]); 27 return pos; 28 } 29 30 void QuickSort(int *data, int begin, int end){ //递归实现 31 if(begin == end){ 32 return; 33 } 34 35 int index = Partition(data, begin, end); 36 if(index > begin){ 37 QuickSort(data, begin, index - 1); 38 } 39 if(end > index){ 40 QuickSort(data, index + 1, end); 41 } 42 } 43 44 int main(){ 45 int num[] = {12, 3, 5, 9, 13, 0, 78, 11, 99, 23, 34, 8}; //测试程序可行性 46 int len = sizeof(num) / sizeof(int); 47 48 QuickSort(num, 0, len); 49 for(int i = 0; i < len; i++){ 50 cout<<num[i]<<' '; 51 } 52 53 return 0; 54 }