当前位置:编程学习 > C/C++ >>

c++编程 选择排序 高手来!

实验内容:对待排序表进行直接选择排序和堆排序
要求:用顺序表来表示,数据最好能由随机产生器决定
补充:给出每部的意思!!
		
答案:
#include <stdlib.h>
#include <iostream>
#include <time.h>
using namespace std;

//调整大根堆
void HeapAdjust(int* pnData, int nStart, int nLen)
{
int nMaxChild = 0;
int nTemp = 0;

while ( ( 2 * nStart + 1) < nLen)
{
nMaxChild = 2 * nStart + 1;
if ( (2 * nStart + 2) < nLen)
{
//比较左子树和右子树,记录最大值的Index
if (pnData[2 * nStart + 1] < pnData[2 * nStart + 2])
{
nMaxChild = 2 * nStart + 2;
}
}

//change data
if (pnData[nStart] < pnData[nMaxChild])
{
//交换nStart与nMaxChild的数据
nTemp = pnData[nStart];
pnData[nStart] = pnData[nMaxChild];
pnData[nMaxChild] = nTemp;

//堆被破坏,需要重新调整
nStart = nMaxChild;
}
else
{
//比较左右孩子均大则堆未破坏,不再需要调整
break;
}
}
}

//堆排序
void HeapSort(int* pnData, int nLen)
{
int i = 0;
int nTemp = 0;

//将pnData[0, Len-1]建成大根堆
for (i = nLen / 2 - 1; i >= 0; i--)
{
::HeapAdjust(pnData, i, nLen);
}

for (i = nLen - 1; i > 0; i--)
{
nTemp = pnData[0];
pnData[0] = pnData[i];
pnData[i] = nTemp;

//将pnData[0...i]重写建成大根堆
::HeapAdjust(pnData, 0, i);
}
}

int main()
{
int a[10] = {0};
int i = 0;

srand((unsigned)time(NULL));

cout << "the orign data:" << endl;
for (i = 0; i < 10; i++)
{
a[i] = ::rand();
cout << a[i] << "\t";
}

cout << endl;

HeapSort(a, 10);

cout << "after sort data" << endl;
for (i = 0; i < 10; i++)
{
cout << a[i] << "\t";
}

cout << endl;
}
太晚了。明天给你编出来放上来吧。-。-# 先去睡了
你使用VC的吧iostream不用拷贝,编译器已经帮你把他们包含在Exe中了。如果你用Dev-C++,那就直接把生成的EXE和一些资源(如图片)拷过去VC比较麻烦要生成一个Release版本,运行速度会比Debug版本快,而且可以脱离VC运行,但不能调试。要给别人用就生成这个版本。具体步骤:请点击 http://zhidao.zzzyk.com/question/28288009.html 答案补充
你好,,你说的要求是不可行的哦.你只是写了一个程序,你只能把这个程序在VISUAL C++ 软件里面编译,编译的过程就是转换成EXE文件的过程,,但一般C程序是很多个程序加在一起才能运作嘀,所以如果你想在别电脑上运行的话,就把你的程序放到别的电脑用VISUAL C++软件打开就得....
希望对你有所帮助
答案补充
去看看吧!
C++语言的设计和演化》
http://www.ibeifeng.com/read.php?tid=589&u=86405
C++应用编程200例
http://www.ibeifeng.com/read.php?tid=15303&u=86405
Visual C++ 6.0 用户界面制作技术与应用实例
http://www.ibeifeng.com/read.php?tid=15298&u=86405
Visual C++实用编程技术——从C++、面向对象到窗口程序设计
http://www.ibeifeng.com/read.php?tid=15296&u=86405
经典教材 -21天教你学会C++ EXE电子书
http://www.ibeifeng.com/read.php?tid=10450&u=86405
/*选择法排序,递增*/   
void select(int a[],int n)
{
int i,j,min,temp;
for(i=0;i<n-1;i++)/*只要选择前n-1个数就行了*/
{
min=i;/*每次循环,把第i个作为最小,记住下标*/
for(j=i+1;j<n;j++)
{
if(a[j]<a[min])
{
temp=min;
min=j;
j=temp;
}
}
if(min!=i)
{
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}

void main()
{
int arr[10]={2,-9,43,4,6,21,5,67,78,88};
int i;
select(arr,10);
for(i=0;i<10;i++)
printf("%d ",arr[i]);
printf("\n");
}
注意区分选择法与冒泡法,选择法交换的次数比冒泡法少得多,效率要好一些!

上一个:c++编程数组排序的问题
下一个:各位帮帮忙!C++编程。

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,