MOOC清华《程序设计基础》第5章:快速排序(分配动态空间)

来源:互联网 发布:zuk z2优化相机 编辑:程序博客网 时间:2024/05/16 10:20
#include <iostream>using namespace std;#define N 18int main(){int a[N] = {30,38,3,32,15,1,41,47,59,80,6,93,78,18,65,60,51,22};void QuickSort(int *array, int length);void OutputOfArray(int *array, int n);cout << "原数组为:" << endl;OutputOfArray(a, N);QuickSort(a, N);cout << "排序后的数组为:" << endl;OutputOfArray(a, N);return 0;}//经典的快速排序算法不同于本例,它不需要分配动态空间,而是巧妙地原地“倒换”元素来实现 void QuickSort(int *array, int length){//递归终止条件if(length <= 1)return; //按最坏可能,为两个子数组分配空间 int *left = new int[length], *right = new int[length];//设置两个子数组长度的初值(为零) int left_index = 0, right_index = 0;//第一步,拆分,要求左半部分都比参照元素小,右半部分都比参照元素大int key = array[0];  //以 0 号元素为参照,有的教材上以任意元素为参照,也许更好 for(int i = 1; i < length; i++){if(array[i] < key)left[left_index++] = array[i];if(array[i] >= key)right[right_index++] = array[i];}//第二步,对子数组进行排序 QuickSort(left, left_index);QuickSort(right, right_index);//第三步,合并子数组,不同于归并排序,快排中的左右已经有序,所以不必比较大小 int index = 0;for(int i = 0; i < left_index; i++)array[index++] = left[i];array[index++] = key;   //不要忘了参照元素 for(int i = 0; i < right_index; i++)array[index++] = right[i];//释放空间delete[] left;delete[] right; }void OutputOfArray(int *array, int n)  {      for(int i = 0; i < n; i++)          cout << array[i] << '\t';      cout << endl;  }  


经典的快速排序算法不同于本例,它不需要分配动态空间,而是巧妙地原地“倒换”元素来实现。


偶数个元素的排序结果:


奇数个元素的排序结果:


阅读全文
0 0
原创粉丝点击