C++五种排序方法(有参考)

    科技2025-04-15  16

    快速排序、堆排序、希尔排序、冒泡排序、选择排序

    数据结构选择:数组 概要设计:定义一个容量为一亿个整数的数组,定义变量n,用rand函数生成n个随机数,并赋值给数组,用clock函数计算排序所用时间。编写排序函数和主函数。

    一、快速排序

    #include<iostream> #include <ctime> #include<cstdlib> using namespace std; int a[100000000],n; void partition(int A[],int s, int t, int& cutpoint) { int x=A[s]; int i=s,j=t; while(i!=j){ while(i<j&&A[j]>x) j--; if(i<j) { A[i]=A[j]; i++; } while(i<j&&A[i]<x) i++; if(i<j) { A[j]=A[i]; j--; } } A[i]=x; cutpoint=i; } void quicksort(int A[],int s,int t) { int f; if(s<t) { partition(A,s,t,f); quicksort(A,s,f-1); quicksort(A,f+1,t); } } int main() { cin >>n; for (int c=0;c<n;c++) a[c]=rand(); int begintime=clock(); quicksort(a,0,n-1); int endtime = clock(); cout<<endtime-begintime<<"ms"<<endl; for(int d=0;d<n;d++) { cout<<a[d]<<" "; } return 0; }

    二、堆排序

    #include<iostream> #include <ctime> #include<cstdlib> #include<vector> using namespace std; void max_heapify(vector<int> &nums, int beg, int end) { int curr = beg; int child = curr * 2 + 1; while (child < end) { if (child + 1 < end &&nums[child] < nums[child + 1]) child++; if (nums[curr] < nums[child]) { swap(nums[curr], nums[child]); curr = child; child = 2 * curr + 1; } else break; } } void heap_sort(vector<int> &nums) { int n = nums.size(); for (int i = n / 2 + 1; i >=0; i--) { max_heapify(nums, i, nums.size() - 1); } for (int i = n - 1; i > 0; i--) { swap(nums[0], nums[i]); max_heapify(nums, 0, i); } } int a[100000000],n; int main() { cin >>n; for (int c=0;c<n;c++) { a[c]=rand(); } int begintime=clock(); vector<int> vec(a,a+n); heap_sort(vec); int endtime = clock(); cout<<endtime-begintime<<"ms"<<endl; for(int d=0;d<n;d++) { cout<<vec[d]<<" "; } return 0; }

    三、希尔排序

    #include<iostream> #include <ctime> #include<cstdlib> #include<vector> using namespace std; int a[100000000],n; void shell_sort(vector<int> &nums) { for(int gap=nums.size()>>1;gap>0;gap>>=1) for (int i = gap; i < nums.size(); i++) { int temp = nums[i]; int j = i - gap; for (; j >= 0 && nums[j] > temp; j -= gap) nums[j +gap] = nums[j]; nums[j+gap] = temp; } } int main() { cin >>n; for (int c=0;c<n;c++) { a[c]=rand();} int begintime=clock(); vector<int> vec(a,a+n); shell_sort(vec); int endtime = clock(); cout<<endtime-begintime<<"ms"<<endl; for(int d=0;d<n;d++) { cout<<vec[d]<<" "; } return 0; }

    四、冒泡排序

    #include<iostream> #include <ctime> #include<cstdlib> using namespace std; int a[100000000],n; int main() { cin >>n; int temp; for (int i=0;i<n;i++) { a[i]=rand(); } int begintime=clock(); for (int i=0;i<n-2;i++) { for (int j=n-2;j>=i;j--) { if(a[j+1]<a[j]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } int endtime = clock(); cout<<endtime-begintime<<"ms"<<endl; for (int j=0;j<n;j++) {cout << a[j] <<" " ;} return 0; }

    选择排序

    #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int a[100000000],n; int main() { int temp; cin >>n; for (int i=0;i<n;i++) { a[i]=rand(); } int begintime=clock(); for (int i=0;i<n;i++) { for (int j=i+1;j<n;j++) { if (a[i]>a[j]) { temp = a[j]; a[j] = a[i]; a[i] = temp; } } } int endtime = clock(); cout<<endtime-begintime<<"ms"<<endl; for (int c=0;c<n;c++) { cout << a[c] <<" " ;} return 0; }

    测试数据

    最多可实现一亿个数的排序。由于数据为一亿时冒泡和选择排序等待时间过长,没有一亿数据的测试结果。 测试效率快速排序>堆排序>希尔排序>冒泡排序>选择排序。

    快速排序运行时间
    堆排序运行时间

    希尔排序运行时间

    冒泡排序运行时间

    选择排序运行结果

    Processed: 0.010, SQL: 8