典例20:排序算法
编写一程序要求能够实现直接插入排序、希尔排序、简单选择排序、冒泡排序和快速排序,并用测试函数对其进行测试。
算法设计:根据题目要求,设计5个排序函数,实现各种排序功能。
(1) 直接插入排序函数InsSort():设计思想,首先令排序表中的第1个记录有序,然后将第2个记录插入到有序表中合适位置,有序表就增加到了两个元素。再将第3个记录插入到有序表中的合适位置,依此类推,直到表中元素全部有序。
(2) 希尔排序函数ShellSort():设计思想,取一个整数d,将全部记录n分为d个子序列,将所有距离为d的记录放在同一个子序列中;在每个子序列内分别施行直接插入排序;然后缩小间隔d,重复上述子序列划分和排序,直到最后取 d = = 1,将所有记录放在同一个序列中排序为止。
(3) 简单选择排序函数SelectSort():首先在所有的记录中选出关键字最小的记录,把它与第一个记录交换,然后在其余的记录中再选出关键字最小的记录,与第二个记录交换,依次类推,直到所有记录排序完成。
(4)冒泡排序函数BubbleSort():设计思想如
(5)快速排序函数QuickSort(int low,int high):设计思想如
算法实现:
#include“iostream.h”
#define MaxSize 100
typedef int DataType;
class SeqList
{
DataType list[MaxSize];
int length;
public:
SeqList(){length = 0;}
void SLCreat(int n);//创建顺序表
void InsSort(); //直接插入排序
void ShellSort(); //希尔排序
void SelectSort(); //简单选择排序
void BubbleSort(); //冒泡排序
void QuickSort(); //快速排序
void QuickSort(int low,int high);//快速排序
int partition(int i,int j);
void SLPrint(); //将顺序表显示在屏幕上
};
//创建顺序表
void SeqList::SLCreat(int n);
{
DataType x;
length = 0;
cout <<“请输入数据元素值:”;
for(int i = 0;i < n;i++)
{
cin >> x;
list[i] = x;
length++;
}
}
//直接插入排序
void SeqList::InsSort()
{
SLCreat(5);
DataType x;
int i,j;
for(i = 0;i < length;i++)
{
x = list[i];
for(j = i-1;j >= 0;j--)
if(x < list[j])
list[j+1] = list[j];
else
break;
list[j+1] = x;
}
cout <<“直接插入排序结果:”;
SLPrint();
}
//希尔排序
void SeqList::ShellSort()
{
SLCreat(5);
DataType x;
int I,j,d,n;
n = length;
for(d = n/2;d >= 1;d/= 2)
{ //按不同分量进行排序
for(i = d;i < n;i++)
{ //将list[i]元素直接插入到对应分组的有序表中
x = list[i];
for(j = I-d;j >= 0;j-= d)
{
if(x < list[j])
list [j+d] = list[j];
else
break;
}
list[j+d] = x;
}
}
cout <<“希尔排序结果:”;
SLPrint();
}
//简单选择排序
void SeqList::SelectSort()
{
SLCreat(5);
DataType x;
int i,j,k;
for(i = 0;i < length;I++)
{
k = i;//用保存当前得到的最小排序码元素的下标,初值为I
for(j = i+1;j < length;j++)
{ //从当前排序区间中顺序查找出具有最小排序码的元素list[k]
if(list[j]<list[k])
k = j;
}
if(k!=I)
{ //把list[k]对调到该排序区间的第一个位置
x = list[i];
list[i] = list[k];
list[k] = x;
}
}
cout <<“简单选择排序结果:”;
SLPrint();
}
//冒泡排序
void SeqList::BubbleSort()
{
SLCreat(5);
DataType x;
int i,j,flag;
for(i = 1;i < length-1;iI++)
{
flag = 0;
for(j = length-1;j >= i;j--)
if(list[j] < list[j-1])
{
x = list[j-1];
list[j-1] = list[j];
list[j] = x;
flag = 1;
}
if(flag == 0)return;
}
cout <<“冒泡排序结果:”;
SLPrint();
}
//快速排序
void SeqList::QuickSort()
{
SLCreat(5);
QuickSort(0,4);
cout <<“快速排序结果:”;
SLPrint();
}
//快速排序
void SeqList::QuickSort(int low,int high)
{
int pos;
if(low < high)
{
pos = partition(low,high);
QuickSort(low,pos-1);
QuickSort(pos+1,high);
}
}
int SeqList::partition(int I,int j)
{
DataType pivotkey;
pivotkey = list[i];
while(i < j)
{
while(i < j&&list[j] >= pivotkey) --j;
if(i < j)list[i++] = list[j];
while(i < j&&list[i] <= pivotkey) ++i;
if(i < j)list[j--] = list[i];
}
list[i] = pivotkey;
return i;
}
//将顺序表显示在屏幕上
void SeqList::SLPrint()
{
for(int i = 0;i < length;i++)
cout << list[i] <<“”;
cout << endl;
}
void main()
{
SeqList myList1,myList2,myList3,myList4,myList5;
int ch,flag = 1;
while(flag)
{
cout << endl;
cout <<“1. 直接插入排序\n”;
cout <<“2. 希尔排序\n”;
cout <<“3. 简单选择排序\n”;
cout <<“4. 冒泡排序\n”;
cout <<“5. 快速排序\n”;
cout <<“6. 退出\n”;
cout <<“请选择(1-6):”;
cin >> ch;
switch(ch)
{
case 1: myList1.InsSort();break;
case 2: myList2.ShellSort();break;
case 3: myList3.SelectSort();break;
case 4: myList4.BubbleSort();break;
case 5: myList5.QuickSort();break;
case 6: flag = 0;break;
}
}
}