数据结构与算法-实验5-自动产生随机数,并实现对数的排序

来源:互联网 发布:linux history删除指定 编辑:程序博客网 时间:2024/06/06 01:40

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <iostream>

using namespace std;

 

void SimpleRandDemo(int s[],int n);         //产生简单的随机数,参数n作为产生随机数个数的限定

 

void RangedRandDemo(int range_min,int range_max, int n);   //产生指定范围的随机数

 

void Merge(int* pDataArray,int *pTempArray, int bIndex, int mIndex, int eIndex);

 

void DMerge(int* pDataArray,int *pTempArray, int bIndex, int mIndex, int eIndex);

 

void UpMergeSort(int* pDataArray,int iDataNum);      //升序排序

 

void DownMergeSort(int* pDataArray,int iDataNum);    //降序排序

 

int main(void)

{

int Test[20];

//时间种子,作为随机数产生的参考

srand((unsigned)time(NULL));

SimpleRandDemo(Test,10);

UpMergeSort(Test, 10);

for (int i = 0; i < 10; i++)

{

cout << Test[i] << " ";

}

printf("\n");

DownMergeSort(Test, 10);

for (int i = 0; i < 10; i++)

{

cout << Test[i] << " ";

}

printf("\n");

//RangedRandDemo(-100, 100, 10);

return 0;

}

 

//产生简单的随机数

void SimpleRandDemo(int s[],int n)

{

// 打印n个随机数

int i;

for (i = 0; i < n; i++)

s[i] = rand();

}

 

//产生指定范围的随机数

void RangedRandDemo(int range_min,int range_max,int n)

{

int i;

for (i = 0; i < n; i++)

{

int u = (double)rand() / (RAND_MAX + 1) * (range_max -range_min)   //随机数产生函数

+ range_min;

printf("  %6d\n", u);

}

}

 

 

/********************************************************

*函数名称:Merge

*参数说明:pDataArray 无序数组;

*          int *pTempArray 临时存储合并后的序列

*          bIndex 需要合并的序列1的起始位置

*          mIndex 需要合并的序列1的结束位置

                  并且作为序列2的起始位置

*          eIndex 需要合并的序列2的结束位置

*说明:    将数组中连续的两个子序列合并为一个有序序列

*********************************************************/

void Merge(int*pDataArray, int *pTempArray, int bIndex, int mIndex, int eIndex)

{

int mLength = eIndex - bIndex;    //合并后的序列长度  

int i = 0;    //记录合并后序列插入数据的偏移  

int j = bIndex;    //记录子序列1插入数据的偏移  

int k = mIndex;    //记录子序列2掺入数据的偏移  

 

while (j < mIndex && k < eIndex)

{

if (pDataArray[j] <=pDataArray[k])

{

pTempArray[i++] = pDataArray[j];

j++;

}

else

{

pTempArray[i++] = pDataArray[k];

k++;

}

}

 

if (j == mIndex)    //说明序列1已经插入完毕  

while (k < eIndex)

pTempArray[i++] = pDataArray[k++];

else                //说明序列2已经插入完毕  

while (j < mIndex)

pTempArray[i++] = pDataArray[j++];

 

for (i = 0; i < mLength; i++)    //将合并后序列重新放入pDataArray  

pDataArray[bIndex + i] =pTempArray[i];

}

 

/********************************************************

*函数名称:BottomUpMergeSort

*参数说明:pDataArray 无序数组;

*          iDataNum为无序数据个数

*说明:    自底向上的归并排序

*********************************************************/

void UpMergeSort(int*pDataArray, int iDataNum)

{

int *pTempArray = (int *)malloc(sizeof(int) *iDataNum);    //临时存放合并后的序列  

int length = 1;    //初始有序子序列长度为1  

while (length < iDataNum)

{

int i = 0;

for (; i + 2 * length < iDataNum; i += 2 * length)

Merge(pDataArray, pTempArray, i, i + length, i + 2 * length);

if (i + length < iDataNum)

Merge(pDataArray, pTempArray, i, i + length,iDataNum);

length *= 2;    //有序子序列长度*2  

}

free(pTempArray);

}

 

void DMerge(int*pDataArray, int *pTempArray, int bIndex, int mIndex, int eIndex)

{

int mLength = eIndex - bIndex;    //合并后的序列长度  

int i = 0;    //记录合并后序列插入数据的偏移  

int j = bIndex;    //记录子序列1插入数据的偏移  

int k = mIndex;    //记录子序列2掺入数据的偏移  

 

while (j < mIndex && k < eIndex)

{

if (pDataArray[j] >=pDataArray[k])

{

pTempArray[i++] = pDataArray[j];

j++;

}

else

{

pTempArray[i++] = pDataArray[k];

k++;

}

}

 

if (j == mIndex)    //说明序列1已经插入完毕  

while (k < eIndex)

pTempArray[i++] = pDataArray[k++];

else                //说明序列2已经插入完毕  

while (j < mIndex)

pTempArray[i++] = pDataArray[j++];

 

for (i = 0; i < mLength; i++)    //将合并后序列重新放入pDataArray  

pDataArray[bIndex + i] =pTempArray[i];

}

 

void DownMergeSort(int*pDataArray, int iDataNum)    //降序排序

{

int *pTempArray = (int *)malloc(sizeof(int) *iDataNum);    //临时存放合并后的序列  

int length = 1;    //初始有序子序列长度为1  

while (length < iDataNum)

{

int i = 0;

for (; i + 2 * length < iDataNum; i += 2 * length)

DMerge(pDataArray, pTempArray, i, i + length, i + 2 * length);

if (i + length < iDataNum)

DMerge(pDataArray, pTempArray, i, i + length,iDataNum);

length *= 2;    //有序子序列长度*2  

}

free(pTempArray);

}

0 0
原创粉丝点击