(图源:大话数据结构)
好文分享:排序算法解析:https://blog.csdn.net/kexuanxiu1163/article/details/103051357
目录
0准备工作
保存排序内容的自定义结构体,其中顺序表的长度,不算哨兵(下标为零的部分)
#define MAX 10
typedef struct SqlistData
{
int r[MAX+1];//把r[0]空出来当哨兵或者临时变量
int length;//记录长度,因为0被空出来了,所以长度和下标此时统一了
}SqList;
交换接口
void swap(SqList * L,int i,int j)//交换
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
打印接口
void print(SqList * L)
{
qDebug()<<"开始打印";
for(int i = 1;i<=L->length;++i)
{
qDebug()<<L->r[i];
}
}
顺序表的储存结构如下:
零位下标什么也不储存,所以无论是遍历还是排序,都是从下标1开始,顺序表长度为5,小标和顺序表中的元素序号完全一致。
1冒泡排序(Bubble Sort)
冒泡排序过程中,我们使用的顺序表是:{9,1,5,8,3,7,4,6,2}
SqList Data = {{0,9,1,5,8,3,7,4,6,2},9};
1.1交换排序
代码 排序外循环特点:n个数字比较n-1次,即可选择出最小
void BubbleSort_Part1(SqList * L)
{
int i,j;
for(i = 1;i<L->length;i++)//9个数循环8次
{
for(j = i+1;j<=L->length;++j)
{
if(L->r[i]>L->r[j])
{
swap(L,i,j);//交换
}
}
}
}
具体操作:
print(&Data);
BubbleSort_Part1(&Data);
qDebug()<<"简单的交换排序后";
print(&Data);
1.2冒泡排序
“按照一个顺序,相邻元素比较,根据顺序进行交换或者不交换”
void BubbleSort_Part2(SqList * L)
{
int i,j;
for(i = 1;i<L->length;i++)//9个数循环8次
{
for(j = L->length;j>i;--j)
{
if(L->r[j-1]>L->r[j])
{
swap(L,j-1,j);//交换
}
}
}
}
具体操作:
print(&Data);
BubbleSort_Part2(&Data);
qDebug()<<"简单的冒泡2排序后";
print(&Data);
输出:
1.3冒牌排序优化
void BubbleSort_Part3(SqList * L)
{
int i,j;
bool flag = true;
for(i = 1;i<L->length&&flag == true;i++)//9个数循环8次
{
qDebug()<<i;
flag = false;
for(j = L->length;j>i;--j)
{
if(L->r[j-1]>L->r[j])
{
swap(L,j-1,j);//交换
flag = true;//没有数据交换的时候,完成排序,直接跳出
}
}
}
}
具体操作:
SqList Data2 = {{0,2,1,3,4,5,6,7,8,9},9};
print(&Data2);
qDebug()<<"循环次数";
BubbleSort_Part3(&Data2);
qDebug()<<"简单的冒泡优化排序后";
print(&Data2);
2简单选择排序
“找到最小的并交换”
代码:排序外循环特点:n个数字比较n-1次,即可选择出最小
void SelectSort(SqList * L)
{
int i,j,min;
for(i = 1;i<L->length;++i)
{
min = i;//假定初始就是最小
for(j = i+1;j<=L->length;++j)
{
if(L->r[j]<L->r[min])
{
min = j;
}
}
if(min!=i)//在外侧判断,不然在循环里面交换的次数太多了,选择出最小的,和该位置交换,然后如此往复
swap(L,i,min);
}
}
具体操作:
print(&Data);
SelectSort(&Data);
qDebug()<<"简单的选择排序后";
print(&Data);
输出: