⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsort.cpp

📁 冒泡发排序
💻 CPP
字号:
#include <iostream.h>
#include <stdlib.h>
#include <iomanip.h>
#include <time.h>



void printResults(double, int);
void bubbleSort(int[], int);
void bidirectionalBubbleSort(int[], int);
void bitonicSort(int[], int);
void sortUp(int[], int, int);
void sortDown(int[], int, int);
void mergeUp(int[], int, int);
void mergeDown(int[], int, int);
void Swap(int[], int, int);

#ifdef DEBUGIT
void printToScreen(int[], int, int);
void printToScreen(float[], int, int);
#endif

//主程序
void main()
{
int i = 0;
int startTime = 0;
int finishTime = 0;
double totalTime = 0.0;
int sampleSizeIndex;

int sampleSizes[] = {10, 50, 100, 500, 1000, 5000, 10000, 50000,
                     100000, 500000, 1000000};

cout << "Multi-Sort Program";

// 正确输入循环
while(1)
   {
   cout << endl << endl << "Sample Sizes:: ";
   for(int i = 0; i < 11; i++)
      cout << sampleSizes[i] << " ";
   cout << endl << "Choices::       ";
   cout << "1  2   3   4    5    6     7     8      9     10      11"
        << endl << endl << "Choose:: ";
   cin >> sampleSizeIndex;
   if((sampleSizeIndex < 1) || (sampleSizeIndex > 12))
      cout << "Your Choice must be between 1 and 12...";
   else
      break;
}
cout << endl;

// 产生随机数组
int *rawData;
rawData = new int[sampleSizes[sampleSizeIndex - 1]];

// 随机起点
srand(time(NULL));

// 产生随机数
for(i = 0; i < sampleSizes[sampleSizeIndex - 1]; i++)
   rawData[i] = rand();

cout << "Statistics::" << endl
     << "The Random Sample Size is " << sampleSizes[sampleSizeIndex - 1]
     << "." << endl << endl;
//冒泡排序
int *bubbleData;
bubbleData = new int[sampleSizes[sampleSizeIndex - 1]];

for(i = 0; i < sampleSizes[sampleSizeIndex - 1]; i++)
   bubbleData[i] = rawData[i];

startTime = clock();
bubbleSort(bubbleData, sampleSizes[sampleSizeIndex - 1] - 1);
finishTime = clock();

#ifdef DEBUGIT
printToScreen(bubbleData, sampleSizes[sampleSizeIndex - 1], 100);
#endif

delete [] bubbleData;
 
totalTime = double(finishTime - startTime) / CLOCKS_PER_SEC;
printResults(totalTime, 0);
// 冒泡排序结束

// 双向冒泡排序
int *biDiBubbleData;
biDiBubbleData = new int[sampleSizes[sampleSizeIndex - 1]];

for(i = 0; i < sampleSizes[sampleSizeIndex - 1]; i++)
   biDiBubbleData[i] = rawData[i];

startTime = clock();
bidirectionalBubbleSort(biDiBubbleData, sampleSizes[sampleSizeIndex - 1] - 1);
finishTime = clock();

#ifdef DEBUGIT
printToScreen(biDiBubbleData, sampleSizes[sampleSizeIndex - 1], 100);
#endif

delete [] biDiBubbleData;
 
totalTime = double(finishTime - startTime) / CLOCKS_PER_SEC;
printResults(totalTime, 1);
// 双向冒泡排序结束



delete [] rawData;
cin.ignore();
cout << "Press [Enter] to Exit" << endl;
cin.get();
}


// 冒泡排序实现

void bubbleSort(int values[], int size)
{
int temp = 0;
for(int j = 0; j < (size - 1); j++)
   for(int k = (j + 1); k < size; k++)
      if(values[j] > values[k])
         Swap(values, j, k);
}

//双向冒泡排序实现
void bidirectionalBubbleSort(int values[], int size)
{
int limit = size;
int st = -1;
while(st < limit)
   {
   st++;
   limit--;
   for(int i = st; i < limit; i++)
      if(values[i] > values[i + 1])
	     Swap(values, i, i + 1);
      
   for(int j = limit; j >= st; --j)
      if(values[j] > values[j+1])
	     Swap(values, j, j + 1);
   }
}


//向上排序
void sortUp(int values[], int m, int size)
{
if(size == 1)
   return;
sortUp(values, m, size/2);
sortDown(values, (m + size/2), size/2);
mergeUp(values, m, size/2);
}
//向下排序
void sortDown(int values[], int m, int size)
{
if(size == 1)
   return;
sortUp(values, m, size/2);
sortDown(values, (m + size/2), size/2);
mergeDown(values, m, size/2);
}

//向上合并
void mergeUp(int values[], int m, int size)
{
if(size == 0)
   return;
for(int i = 0; i < size; i++)
   if(values[m + i] > values[m + i + size])
      Swap(values, m + i, m + i + size);
        
mergeUp(values, m, size/2);
mergeUp(values, m + size, size/2);
}

//向下合并
void mergeDown(int values[], int m, int size)
{
if(size == 0)
   return;
for(int i = 0; i < size; i++)
   if(values[m + i] < values[m + i + size])
      Swap(values, m + i, m + i + size);

mergeDown(values, m, size/2);
mergeDown(values, m + size, size/2);
}

//交换
void Swap(int values[], int i, int j)
{
  int temp = values[i];
  values[i] = values[j];
  values[j] = temp;
}

//结果输出
void printResults(double totalTime, int title)
{
char* titles[] = {"Bubble Sort", "Bi-Directional Bubble Sort",
                  "Bitonic Sort"};
cout << "The execution time for " << titles[title] << " is:: "  
     << setprecision(5) << setiosflags(ios::fixed|ios::showpoint) 
     << totalTime << " Seconds." << endl;
}

//屏幕输出
#ifdef DEBUGIT
void printToScreen(int values[], int size, int stepSize)
{
int columns = 0;
cout << endl << "DEBUG CODE::: " << endl;
for(int i = 0; i < size; i += stepSize)
   {
   cout << setw(6) << values[i];
   columns++;

   if(columns % 10 == 0)
      cout << endl;
   }
   cout << endl;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -