本文已参与「新人创作礼」活动,一起开启掘金创作之路。
【算法】冒泡、选择、快速排序算法设计与实现
一、目的
掌握算法的概念和问题的求解过程。
二、实验内容
用多种不同方式解决n个整数的排序问题。
三、设计和编码
1.算法伪代码
1.1冒泡排序
输入:无序数组a[],数组元素个数n
输出:有序数组a[n]
1.定义exchange的初值为n-1
2.判断exchange的值不为0时
2.1 设置最大值bound为exchange的值
2.2 如果r[j]>r[j+1]
2.3 将exchange值与r[j]交换
1.2选择排序
输入:无序数组a[],数组元素个数n
输出:有序数组a[n]
1.定义index的初值为r[i],j=i+1
2.判断r[j]<r[index]时
2.1 将r[j]与r[index]的值进行交换
1.3快速排序
输入:无序数组a[],数组首地址序号first,末地址序号end
输出:有序数组a[n]
1.判断首地址序号first小于末地址序号end时
1.1 如果first<end && a[first]<=a[end],end--
1.1.1 交换a[first]与a[end]的值,first++
1.2 如果first<end && a[first]<=a[end],end++
1.2.1 交换a[first]与a[end]的值,first--
2.程序代码
2.1冒泡排序
#include<stdio.h>
void BubbleStort(int r[],int n)
{
int bound,exchange=n-1;
while(exchange!=0)
{
bound=exchange;
exchange=0;
for(int j=0;j<bound;j++)
if(r[j]>r[j+1])
{
int temp=r[j];
r[j]=r[j+1];
r[j+1]=temp;
exchange=j;
}
}
}
2.2选择排序
void SelectSort(int r[],int n)
{
int i,j,index,temp;
for(i=0;i<n-1;i++)
{
index=i;
for(j=i+1;
j<n;j++)
if(r[j]<r[index]) index=j;
if(index!=i)
{
temp=r[i];
r[i]=r[index];
r[index]=temp;
}
}
}
2.3快速排序
int Partition(int r[],int first,int end)
{
int i=first,j=end;
while(i<j)
{
while(i<j&&r[i]<=r[j]) j--;
if(i<j)
{
int temp=r[i];r[i]=r[j];r[j]=temp;
i++;
}
while (i<j&&r[i]<=r[j]) i++;
if(i<j)
{
int temp=r[i];r[i]=r[j];r[j]=temp;
j--;
}
}
return i;
}
2.4输出(主函数)
void putnum(int r[],int n)
{
int i;
printf("输出序列:");
for(i=0;i<n;i++)
printf("%d ",r[i]);
}
int main()
{
int a[6]={30,8,7,45,5,24};
printf("输入序列:30 8 7 45 5 24\n");
BubbleStort(a,6); //冒泡排序
putnum(a,6);
// SelectSort(a,6); //选择排序
// Partition(a,6,1); //快速排序
// QuickSort(a,7,2);
}
四、运行结果及分析
4.1.结果截图
4.2.分析
我们运用冒泡排序,选择排序及快速排序成功的对所给数组进行了排序。各个排序法各有其优点,在不同情况下需要用到不同的排序方法才能实现效率的最大化。