问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...归并排序,冒泡排序中哪个要求内存量最大?为什么

发布网友 发布时间:2024-03-28 11:13

我来回答

1个回答

热心网友 时间:2024-06-24 02:56

s the entry point for the console application.
//默认是从小到大排序

#include <time.h>
#include <iostream>
#include <iomanip>

using namespace std;
//要排序的数组的长度,以及取值的范围
#define SIZE 10
#define MAX 10000
//---------------------------------插入排序----------------------------------------
//直接插入排序080201
//原理:每次将待排序的记录,按其关键字大小插入到前边已经排好序的子文件中的适当位置
int InsertSort(int arr[],int len){
int temp,j;
for(int i=1;i<len;i++){
if(arr[i]<arr[i-1]){
temp=arr[i];
j=i;
do{
arr[j]=arr[j-1];
j--;
}while(j>0&&arr[j-1]>temp);
arr[j] = temp;
}
}
return 0;
}

//SHELL排序 希尔排序 8.2.2
/*
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。
所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;
然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),
即所有记录放在同一组中进行直接插入排序为止。
*/
int ModifiedInsertSort(int arr[],int n,int delta){
int temp;
for(int i=delta;i<n;i+=delta){
for(int j=i;j>=delta;j-=delta){
if(arr[j]<arr[j-delta]){
temp = arr[j];
arr[j] = arr[j-delta];
arr[j-delta] = temp;
}
}
}
return 0;
}
int ShellSort(int arr[],int len){
//
for(int delta=len/2;delta>0;delta/=2){
//分别对delta个子序列进行排序//
for(int j=0;j<delta;j++){
ModifiedInsertSort(&arr[j],len-j,delta);
}
}
return 0;
}

//1. 不设监视哨的算法描述
////注意: 当增量d=1时,ShellPass和InsertSort基本一致,只是由于没有哨兵而在内循环中增加了一个循环判定条件"j>0",以防下标越界。
void ShellPass(int *R,int n,int d)
{//希尔排序中的一趟排序,d为当前增量
int i,j;
for(i=d+1;i<=n;i++) //将R[d+1..n]分别插入各组当前的有序区
if(R[i] <R[i-d] ){
R[0]=R[i];j=i-d; //R[0]只是暂存单元,不是哨兵
do {//查找R[i]的插入位置
R[j+d]=R[j]; //后移记录
j=j-d; //查找前一记录
}while(j>0&&R[0] <R[j] );
R[j+d]=R[0]; //插入R[i]到正确的位置上
} //endif
} //ShellPass

void ShellSort11(int* R,int n)
{
int increment=n; //增量初值,不妨设n>0
do {
increment=increment/3+1; //求下一增量
ShellPass(R,n,increment); //一趟增量为increment的Shell插入排序
}while(increment>1);
} //ShellSort

/*
2.设监视哨的shell排序算法
算法分析
1.增量序列的选择
Shell排序的执行时间依赖于增量序列。
好的增量序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在nl.25到1.6n1.25之间。

2.Shell排序的时间性能优于直接插入排序
希尔排序的时间性能优于直接插入排序的原因:
①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
②当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
因此,希尔排序在效率上较直接插人排序有较大的改进。

3.稳定性
希尔排序是不稳定的。参见上述实例,该例中两个相同关键字49在排序前后的相对次序发生了变化。
*/

//---------------------------------交换排序----------------------------------------
//交换排序---冒泡排序,快速排序
//原理:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
//冒泡排序080301
int BubbleSort(int arr[],int len){
int k,temp ;
for(int i=0;i<len-1;i++){
k = i;
for(int j=i+1;j<len;j++){
if(arr[j]<arr[k])
k = j;
}
if(k!=i){
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
return 0;
}
//优化的冒泡排序
int ImprovedBubbleSort(int arr[],int len){
bool noswap;
int temp;
for(int i=0;i<len;i++){
noswap = true;
for(int j=len-1;j>i;j--){
if(arr[j]<arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
noswap = false;
}
}
if(noswap){
break;
}
}
return 0;
}

//快速排序080302
int Partition(int arr[],int len,int i,int j){
int pivot = arr[i];
while(i<j){
while(i<j&&arr[j]>=pivot){
j--;
}
if(i<j){
arr[i++] = arr[j];
}
while(i<j&&arr[i]<=pivot){
i++;
}
if(i<j){
arr[j--] = arr[i];
}
}
arr[i] = pivot;
return i;
}
int QuickSort(int arr[],int len,int low=0,int high=SIZE){
int pivotpos;
if(low<high){
pivotpos = Partition(arr,len,low,high);
QuickSort(arr,len,low,pivotpos-1);
QuickSort(arr,len,pivotpos+1,high);
}
return 0;
}

//---------------------------------选择排序----------------------------------------
//直接选择排序080401
//原理:每一趟从待排序的记录中选出关键字最小的记录,顺序放到已排好序的子文件的最后
int StraightSelect(int arr[],int len){
int temp=0;
int k;
for(int i=0;i<len;i++){
k=i;
for(int j=k+1;j<len;j++){
if(arr[j]<arr[k]){
k = j;
}
}
if(k!=i){
temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
}
}
return 0;
}

//---------------------------------归并排序----------------------------------------
//归并排序:
int Merge(int arr[],int len){

return 0;
}

//---------------------------------分配排序----------------------------------------
//桶排序,箱排序8.6
//事先知道序列中的记录都位于某个小区间段[0,m)内
// 将具有相同值的记录都分配到同一个桶中,然后依次按照编号从桶中取出记录,组成一个有序序列
int BucketSort(int arr[],int len){
int max = MAX;//最大值
int *count = new int[max];
int i;
for(i=0;i<max;i++){
count[i] = 0;
}
for(i=0;i<len;i++){
count[arr[i]]++;
}
for(i=0;i<len;){
for(int j=0;j<max;j++){
while(count[j]>0){
arr[i++] = j;
count[j]--;
}
}
}
return 0;
}

//打印数组
int printarr(int arr[],int len){

for(int i=0;i<len;i++){
if(i%10==0)
cout<<endl;
cout<<setw(4)<<arr[i]<<" ";
}
cout<<endl;
return 0;
}

int main()
{
int arr[SIZE];
int len = sizeof(arr)/sizeof(arr[0]);//SIZE
srand( (unsigned)time( NULL ) );
for(int i=0;i<len;i++){
arr[i] =rand()%MAX;
}
cout<<"生成数组:"<<endl;
printarr(arr,len);
// StraightSelect(arr,len);
// InsertSort(arr,len);
// BubbleSort(arr,len);
// QuickSort(arr,len);
// ImprovedBubbleSort(arr,len);
// ShellSort(arr,len);
BucketSort(arr,len);
cout<<endl<<"排序后得到的数组:"<<endl;
printarr(arr,len);

return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 ...归并排序的原理都是是什么?哪个要求内存量最大? (54) 在下列几种排序方法中,要求内存量最大的是___。 A. 插入排序 B... ...你选一个号码要在开出的20个号码之中,真实概率是多少? 魅族魅蓝note1为什么经常自动锁屏 为什么魅族note突然就闪了一下自动锁屏呢?怎么办 魅族X2怎么老是自动锁屏? xp多国语言包如何使用 从安吉去杭州自驾游的行程可以怎么安排? 阜阳市公安局交警投诉热线是多少 阜阳交警直属六大队队长是谁 阜阳市颍上县交通违章处理时间法律规定有哪些10 安徽省阜阳市交通违章处理的费用是多少6 防撞护栏灯目前在国内实施的工程案例有哪些? C语言中二维数组行指针是什么78 二维数组名和指针的关系41 c语言中二维数组的指针如何表示10 二维数组如何用指针表示180 在生产和生活中,人们主要选择现代的交通运输方式,传统的交通运...10 求帮写一篇校庆晚会记叙文800字,谢谢 ...的校园生活写一篇《这里有我的收获》记叙文 800至850字 在下列几种排序方法中,要求买内存量最大的是() A插入排序B选择排序C快速... 口袋妖怪漆黑的魅影茵都镇道馆键子草怎么打 照片怎么添加微信图标和水印 辩论的语言特点有哪些6 学术辩论有什么特点5 辩论的特点11 简述辩论的特征2 是时间变了,还是人变了 哪个银行信用卡好?4800 编绳用火机烧会不会断 不知道哪个狐狸精送了个Zippo给我男朋友,我想把它不动身色的弄坏... 砚台种类都有那些?65 古代的砚台的种类有哪些?1 中国砚台有名的有哪些?1 怎么区分砚台的种类?118 砚台的种类1 半真半假打一字并说理由 关于设明细帐 以夫妻名义办理了住房公积金贷款后,选择离婚了,会有什么影响啊_百度知 ... qq游戏轩辕传奇如何玩