欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++分治策略实现快速排序

程序员文章站 2023-11-01 20:24:40
代码实现了利用递归对数组进行快速排序,其中limit为从已有的随机数文件中输入的所要进行排序的数据的数量(生成随机数并写入文件的过程已在前篇中写出)。 算法主要利用哨兵元素对数据进行分块,递归无限细分之后实现排序。 代码同样利用clock函数对算法的执行时间进行计算以进行算法的效率评估。 为了验证排 ......

代码实现了利用递归对数组进行快速排序,其中limit为从已有的随机数文件中输入的所要进行排序的数据的数量(生成随机数并写入文件的过程已在前篇中写出)。

算法主要利用哨兵元素对数据进行分块递归无限细分之后实现排序。

代码同样利用clock函数对算法的执行时间进行计算以进行算法的效率评估

为了验证排序结果,代码实现了将排序后的内容输出到同文件夹下的sort_number.txt文件中。

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstdlib>
 4 #include <ctime>
 5 #include <algorithm>
 6 using namespace std;
 7 #define limit 100000
 8 
 9 void quicksort(int a[], int low ,int high)
10 {
11     if(low<high){                //递归的终止条件
12         int i = low, j = high;   //使用i,j在对应区间内对数组进行排序;
13         int x = a[low];          //将数组的第一个元素作为哨兵,通过这种方式取出哨兵元素
14 
15         while(i < j){
16           while(i < j && a[j] >= x)
17               j--;               //从右向左寻找第一个比哨兵元素小的元素
18           if(i < j){
19               a[i] = a[j];
20               i++;               //把找到的第一个小于哨兵元素的元素值赋值给第一个元素,并把下界(i)向后移一位
21           }
22 
23           while(i < j && a[i] <= x)
24               i++;                //从左向右寻找第一个比哨兵元素大的元素
25           if(i < j){
26               a[j] = a[i];
27               j--;
28           }                       //把找到的第一个大于哨兵元素的元素值赋值给下标为j的元素,并把上界(j)向前移一位
29         }
30         a[i] = x;                 //把哨兵赋值到下标为i的位置,i前的元素均比哨兵元素小,i后的元素均比哨兵元素大
31 
32         quicksort(a, low ,i-1);   //递归进行哨兵前后两部分元素排序
33         quicksort(a, i+1 ,high);
34     }
35 }
36 int main(void)
37 {
38     ifstream fin;
39     ofstream fout;
40     int x;
41     int i;
42     int a[limit];
43 
44     fin.open("random_number.txt");
45     if(!fin){
46         cerr<<"can not open file 'random_number.txt' "<<endl;
47         return -1;
48     }
49     time_t first, last;
50 
51 
52     for(i=0; i<limit; i++){
53         fin>>a[i];
54     }
55     fin.close();
56 
57     first = clock();
58 
59     quicksort(a,0,limit-1);
60 
61     last = clock();
62 
63     fout.open("sort_number.txt");
64 
65     if(!fout){
66         cerr<<"can not open file 'sort_number.txt' "<<endl;
67         return -1;
68     }
69     for(i=0; i<limit; i++){
70         fout<<a[i]<<endl;
71     }
72 
73     fout.close();
74 
75     cout<<"sort completed (already output to file 'sort_number.txt')!"<<endl;
76     cout<<"time cost: "<<last-first<<endl;
77 
78     return 0;
79 }