编写C++代码,对一组数据进行至少四种排序(直接插入排序、快速排序、希尔排序、直接选择排序、堆排序、归并排序)。要求数据随机生成1000个以上的数据,每种算法都要统计比较次数和移动次数。

时间: 2023-12-24 07:05:23 浏览: 24
好的,以下是C++代码实现六种排序算法,可以满足你的需求: ```c++ #include <iostream> #include <cstdlib> #include <ctime> using namespace std; void print(int* a, int size) { for(int i=0; i<size; i++) cout<<a[i]<<" "; cout<<endl; } void Swap(int* a, int* b) { int temp=*a; *a=*b; *b=temp; } // 直接插入排序 void InsertionSort(int* a, int size, int& cmp, int& mov) { for(int i=1; i<size; i++) { int temp=a[i]; int j=i-1; while(j>=0 && a[j]>temp) { cmp++; mov++; a[j+1]=a[j]; j--; } cmp++; a[j+1]=temp; } } // 快速排序 int Partition(int* a, int low, int high, int& cmp, int& mov) { int pivot=a[low]; while(low<high) { while(low<high && a[high]>=pivot) { cmp++; high--; } cmp++; mov++; a[low]=a[high]; while(low<high && a[low]<=pivot) { cmp++; low++; } cmp++; mov++; a[high]=a[low]; } a[low]=pivot; return low; } void QuickSort(int* a, int low, int high, int& cmp, int& mov) { if(low<high) { int pivot=Partition(a, low, high, cmp, mov); QuickSort(a, low, pivot-1, cmp, mov); QuickSort(a, pivot+1, high, cmp, mov); } } // 希尔排序 void ShellSort(int* a, int size, int& cmp, int& mov) { int gap=size/2; while(gap>0) { for(int i=gap; i<size; i++) { int temp=a[i]; int j=i-gap; while(j>=0 && a[j]>temp) { cmp++; mov++; a[j+gap]=a[j]; j-=gap; } cmp++; a[j+gap]=temp; } gap/=2; } } // 直接选择排序 void SelectionSort(int* a, int size, int& cmp, int& mov) { for(int i=0; i<size-1; i++) { int minIndex=i; for(int j=i+1; j<size; j++) { if(a[j]<a[minIndex]) { cmp++; minIndex=j; } cmp++; } Swap(&a[i], &a[minIndex]); mov+=3; } } // 堆排序 void AdjustHeap(int* a, int parent, int size, int& cmp, int& mov) { int child=parent*2+1; while(child<size) { if(child+1<size && a[child]<a[child+1]) { cmp++; child++; } cmp++; if(a[parent]<a[child]) { Swap(&a[parent], &a[child]); mov+=3; parent=child; child=parent*2+1; } else break; } } void HeapSort(int* a, int size, int& cmp, int& mov) { for(int i=size/2-1; i>=0; i--) AdjustHeap(a, i, size, cmp, mov); for(int i=size-1; i>=1; i--) { Swap(&a[0], &a[i]); mov+=3; AdjustHeap(a, 0, i, cmp, mov); } } // 归并排序 void Merge(int* a, int* b, int low, int mid, int high, int& cmp, int& mov) { int i=low, j=mid+1, k=low; while(i<=mid && j<=high) { if(a[i]<=a[j]) { cmp++; b[k++]=a[i++]; } else { cmp++; b[k++]=a[j++]; } } while(i<=mid) b[k++]=a[i++]; while(j<=high) b[k++]=a[j++]; for(int i=low; i<=high; i++) { a[i]=b[i]; mov++; } } void MergeSort(int* a, int* b, int low, int high, int& cmp, int& mov) { if(low<high) { int mid=(low+high)/2; MergeSort(a, b, low, mid, cmp, mov); MergeSort(a, b, mid+1, high, cmp, mov); Merge(a, b, low, mid, high, cmp, mov); } } int main() { const int SIZE=1000; int a[SIZE], b[SIZE]; srand(time(NULL)); for(int i=0; i<SIZE; i++) a[i]=rand(); int cmp, mov; cout<<"Insertion Sort:\n"; cmp=mov=0; InsertionSort(a, SIZE, cmp, mov); cout<<"Compare: "<<cmp<<endl; cout<<"Move: "<<mov<<endl; cout<<"Quick Sort:\n"; cmp=mov=0; QuickSort(a, 0, SIZE-1, cmp, mov); cout<<"Compare: "<<cmp<<endl; cout<<"Move: "<<mov<<endl; cout<<"Shell Sort:\n"; cmp=mov=0; ShellSort(a, SIZE, cmp, mov); cout<<"Compare: "<<cmp<<endl; cout<<"Move: "<<mov<<endl; cout<<"Selection Sort:\n"; cmp=mov=0; SelectionSort(a, SIZE, cmp, mov); cout<<"Compare: "<<cmp<<endl; cout<<"Move: "<<mov<<endl; cout<<"Heap Sort:\n"; cmp=mov=0; HeapSort(a, SIZE, cmp, mov); cout<<"Compare: "<<cmp<<endl; cout<<"Move: "<<mov<<endl; cout<<"Merge Sort:\n"; cmp=mov=0; MergeSort(a, b, 0, SIZE-1, cmp, mov); cout<<"Compare: "<<cmp<<endl; cout<<"Move: "<<mov<<endl; return 0; } ```

相关推荐

最新推荐

recommend-type

C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

本文实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序 首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序、冒泡排序...
recommend-type

C++实现对输入数字组进行排序

里给大家介绍的是通过某个方法实现判断命令行中输入的数字是几个,这样再用冒泡法排序的时候就不用担心输入的是几个数字,用到的知识主要是冒泡法排序
recommend-type

c++实现对输入数组进行快速排序的示例(推荐)

下面小编就为大家带来一篇c++实现对输入数组进行快速排序的示例(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

C++实现折半插入排序(BinaryInsertSort)

本文实例为大家分享了C++实现折半插入排序的具体代码,供大家参考,具体内容如下 一、思路: 较插入排序,减少了比较的次数,但是插入时间还是一样。 (1)按二分查找的方法,查找V[i]在V[0],V[1]…V[i-1]中插入的...
recommend-type

C中qsort快速排序使用实例

在学习C++ STL的sort函数,发现C中也存在一个qsort快速排序,要好好学习下C的库函数啊
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

如何用python编写api接口

在Python中编写API接口可以使用多种框架,其中比较流行的有Flask和Django。这里以Flask框架为例,简单介绍如何编写API接口。 1. 安装Flask框架 使用pip命令安装Flask框架: ``` pip install flask ``` 2. 编写API接口 创建一个Python文件,例如app.py,编写以下代码: ```python from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/hello', methods=['GET']) def hello():
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。