在最近的学习中,对于排序算法进行了一定的学习,在这里对快速排序和选择排序的部分内容进行说明,其余内容在后期会进行补充,感谢大家提出宝贵意见。
宏定义如下:
<strong><span style="font-size:18px;">#include <iostream> using namespace std; #define M 21 typedef int SqList[M];</span></strong>
<strong><span style="font-size:18px;">void BubbleSort(SqList &L,int n) //冒泡排序
{
for(int i = 0;i < n;++i) //外层循环记录循环次数
{
for(int j = 0;j < n-i-1;++j) //内层循环记录每一次循环比较的次数
{ //(j<n-i-1)比较一次后,其后值不参与再比较
if(L[j] > L[j+1]) //若前者大于后者,则交换位置
{
int tmp = L[j];
L[j] = L[j+1];
L[j+1] = tmp;
}
}
}
}</span></strong>
<strong><span style="font-size:18px;">//改进方式,直接赋值
int Partition(SqList &L,int low,int high) //返回枢轴所在位置,它之前的小于它
{ //之后的大于它
int key = L[low]; //枢轴记录关键字
while(low < high) //判别条件,不满足时结束
{
while(low < high && L[high] >= key ) //若右边的大于枢轴
{
high--; //向前比较
}
L[low] = L[high]; //否则赋值
while(low < high && L[low] <= key) //若左边的小于枢轴
{
low++; //向后比较
}
L[high] = L[low]; //否则赋值
}
L[low] = key; //此时low = high,即可等价为L[high] = key,枢轴记录到位
return low; //返回此时位置
}
//交换方式
/*int Partition(SqList &L,int low,int high)
{
int key = L[low];
while(low < high)
{
while(low < high && L[high] >= key )
{
high--;
}
int tmp = L[low];
L[low] = L[high];
L[high] = tmp;
while(low < high && L[low] <= key)
{
low++;
}
tmp = L[low];
L[low] = L[high];
L[high] = tmp;
}
return low;
}*/
void QuickSort(SqList &L,int low,int high) //快速排序
{
if(low < high)
{
int prvitloc = Partition(L,low,high); //将数组一分为二
QuickSort(L,low,prvitloc-1); //左半部分排序
QuickSort(L,prvitloc+1,high); //右半部分排序
}
}</span></strong>
<strong><span style="font-size:18px;">int SelectMinKey(SqList &L,int n,int key) //选择第key小的记录下标
{
for(int k = key+1;k < n;++k) //只比较key之后的
{
if(L[k] < L[key]) //若小于则记录下标
{
key = k;
}
}
return key; //返回下标
}
void SelectSort(SqList &L,int n) //简单选择排序
{
for(int i = 0;i < n-1;++i)
{
int j = SelectMinKey(L,n,i); //第key小的记录位置
if(i != j) //若不为此位置数,则交换位置
{
int tmp = L[i];
L[i] = L[j];
L[j] = tmp;
}
}
}</span></strong>
如下附上完整版函数和测试代码:
<strong><span style="font-size:18px;">#include <iostream>
using namespace std;
#define M 21
typedef int SqList[M];
void BubbleSort(SqList &L,int n) //冒泡排序
{
for(int i = 0;i < n;++i) //外层循环记录循环次数
{
for(int j = 0;j < n-i-1;++j) //内层循环记录每一次循环比较的次数
{ //(j<n-i-1)比较一次后,其后值不参与再比较
if(L[j] > L[j+1]) //若前者大于后者,则交换位置
{
int tmp = L[j];
L[j] = L[j+1];
L[j+1] = tmp;
}
}
}
}
//改进方式,直接赋值
int Partition(SqList &L,int low,int high) //返回枢轴所在位置,它之前的小于它
{ //之后的大于它
int key = L[low]; //枢轴记录关键字
while(low < high) //判别条件,不满足时结束
{
while(low < high && L[high] >= key ) //若右边的大于枢轴
{
high--; //向前比较
}
L[low] = L[high]; //否则赋值
while(low < high && L[low] <= key) //若左边的小于枢轴
{
low++; //向后比较
}
L[high] = L[low]; //否则赋值
}
L[low] = key; //此时low = high,即可等价为L[high] = key,枢轴记录到位
return low; //返回此时位置
}
//交换方式
/*int Partition(SqList &L,int low,int high)
{
int key = L[low];
while(low < high)
{
while(low < high && L[high] >= key )
{
high--;
}
int tmp = L[low];
L[low] = L[high];
L[high] = tmp;
while(low < high && L[low] <= key)
{
low++;
}
tmp = L[low];
L[low] = L[high];
L[high] = tmp;
}
return low;
}*/
void QuickSort(SqList &L,int low,int high) //快速排序
{
if(low < high)
{
int prvitloc = Partition(L,low,high); //将数组一分为二
QuickSort(L,low,prvitloc-1); //左半部分排序
QuickSort(L,prvitloc+1,high); //右半部分排序
}
}
int SelectMinKey(SqList &L,int n,int key) //选择第key小的记录下标
{
for(int k = key+1;k < n;++k) //只比较key之后的
{
if(L[k] < L[key]) //若小于则记录下标
{
key = k;
}
}
return key; //返回下标
}
void SelectSort(SqList &L,int n) //简单选择排序
{
for(int i = 0;i < n-1;++i)
{
int j = SelectMinKey(L,n,i); //第key小的记录位置
if(i != j) //若不为此位置数,则交换位置
{
int tmp = L[i];
L[i] = L[j];
L[j] = tmp;
}
}
}
void main()
{
SqList sq2 = {53,24,35,56,32,78,99};
for(int i = 0;i < 7; ++i) //打印sq2
{
cout<<sq2[i]<<" ";
}
cout<<endl;
BubbleSort(sq2,7); //冒泡排序结果打印
for(i = 0;i < 7; ++i)
{
cout<<sq2[i]<<" ";
}
cout<<endl;
QuickSort(sq2,0,6); //快速排序
for(i = 0;i < 7; ++i)
{
cout<<sq2[i]<<" ";
}
cout<<endl;
SelectSort(sq2,7); //简单选择排序
for(i = 0;i < 7; ++i)
{
cout<<sq2[i]<<" ";
}
cout<<endl;
}</span></strong>
原文地址:http://blog.csdn.net/qaz3171210/article/details/46527083