——想把C++捡起来,拿2个常用的排序算法练练手。
头文件
#define MAX 100
//函数声明
int *BubbleSort(int size, int *Array);
int *QuickSort(int a, int b, int *Array);
void PrintArray(int *Array, int position1 = MAX, int position2 = MAX);//加了2个默认参数用来显示正在处理的数
using std::cin;
using std::cout;
源文件
—— 采用了一个一维动态数组储存输入数列,不知道有没有必要……
#include <iostream>
#include "Header.h"
int main()
{
int a[MAX], i = 0, j=0;
int method=0,flag=1;
char ch;
cout <<"这里是排序算法小实验\n请输入一组整数型数列,以0表示结束:\n";
do{
cin >> a[i];
} while (a[i++] != 0);
int len = i-1;
int *p = new int[len];//定义一个变长的动态一维数组;
for (i = 0; i < len+1; i++)//len+1 使得以0作为结束
{
p[i] = a[i];
}
cout << "您输入的数列为:";
PrintArray(p);
cout << "\n共"<<len<<"个数\n请选择您要使用的排序算法:(输入1 冒泡排序 输入2 快速排序)\n";
while (flag)//用flag标记代替goto语句,限制输入
{
cin >> method;//选择算法序号
switch (method)
{
case 1:cout << "\n冒泡排序步骤如下:\n"; p = BubbleSort(len, p); flag = 0; break;
case 2:cout << "\n快速排序步骤如下:\n"; p = QuickSort(0, len - 1, p); flag = 0; break;
default:cout << "您没有输入正确的号码!请重新输入\n"; break;
}
}
cout << "\n排序的结果为:\n";
PrintArray(p);
cout << "\n谢谢使用!\n";
cin >> ch;
delete[] p;
}
几个函数的定义
int *BubbleSort(int size, int *Array)//冒泡排序
{
int temp;
int i, j;
for (i = 0; i < size - 1; i++)
{
cout << "第" << i + 1 << "次排序:";
for (j = 1; j < size - i; j++)
{
if (Array[j - 1] >= Array[j])//两两比较,把大数往后排
{
temp = Array[j - 1];
Array[j - 1] = Array[j];
Array[j] = temp;//完成交换
}
}
PrintArray(Array, size - i - 1);//打印
}
return Array;
}
——快速排序比较难写,有分治还有递归,8年没碰C++了……
int *QuickSort(int a, int b, int *Array)//快速排序
{
int i = a, j = b;//分治思想,i从左往右扫描,j从右往左扫描
int k = i;
int temp = Array[k];//以Array[k]的值为标准判别数列,大数放右边,小数放左边
int count;//记录排序次数
while (i != j)
{
while (Array[k]<Array[j])//从尾巴与Array[k]比较
{
j--;//尾巴都大于Array[k],扫描下一个
}
if (k != j)
{
temp = Array[k];//尾巴有小于Array[k]跳出,位置交换
Array[k] = Array[j];
Array[j] = temp;
k = j;
i++;
}
else
{
break;//队尾全部大于Array[k]
}
while (Array[i]<Array[k])//前面与Array[k]比较
{
i++;//前面都小于Array[k],扫描下一个
}
if (i != k)
{
temp = Array[k];//前面有大于Array[k]跳出,位置交换
Array[k] = Array[i];
Array[i] = temp;
k = i;
j--;
}
else
{
break;//前面全部小于Array[k]
}
}
count++;
cout << "第" <<count<< "次排序:";
PrintArray(Array, k);//打印队列,k位置前面的数都比它小,k位置后面的数都比它大
if (k > a + 1)
{
int *front = QuickSort(a, k - 1, Array);//将k位置前面的数递归快速排序
}
if (k + 1 < b)
{
int *after = QuickSort(k + 1, b, Array);//将k位置后面的数递归快速排序
}
return Array;
}
—— 在头文件的函数声明中设了2个默认参数,定义时不用加默认值了,不然会报错。
void PrintArray(int *Array, int position1, int position2)//打印数列
{
int i = 0;
if (position1 == MAX && position2 == MAX)//没有位置参数
{
while (Array[i] != 0)
{
cout << Array[i] << "\t";
i++;
}
}
else if (position1 != MAX && position2 == MAX)//有1个位置参数
{
while (Array[i] != 0)
{
if (position1 == i)
{
cout << "*";
}
cout << Array[i] << "\t";
i++;
}
}
else if (position1 != MAX && position2 != MAX)//有2个位置参数,给二叉树排序准备的
{
while (Array[i] != 0)
{
if (position1 == i || position2 == i)
{
cout << "*";
}
cout << Array[i] << "\t";
i++;
}
}
cout << "\n";
}
运行
可见快速排序优于冒泡排序。
看到那些*号了吗?嘻嘻,这就是PrintArray()中默认参数Position们的功劳
——写代码真是件容易着迷的事情,不想去吃饭,居然还忘了挤奶,哎哟,我是苦逼的背奶妈妈~明天不能忽略宝宝的口粮了~~~><!