C语言实现冒泡排序、选择排序、快速排序

一、目的
掌握算法的概念和问题的求解过程。

二、实验内容
用多种不同方式解决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;
	
}

PS:递归实现

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;	
}

void QuickSort(int r[],int first,int end){
    
    
	int pivot;
	if(first<end){
    
    
		pivot=Partition(r,first,end);
		QuickSort(r,first,pivot-1);
		QuickSort(r,pivot+1,end);
	}
}

int main(){
    
    
	int a[5]={
    
    7,5,9,8,2};
	printf("初始数组:7,5,9,8,2\n");
	QuickSort(a,7,2);
	putnum(a,5);
} 

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); 
}

四、运行结果及分析
1.结果截图
在这里插入图片描述

2.分析
我们运用冒泡排序,选择排序及快速排序成功的对所给数组进行了排序。各个排序法各有其优点,在不同情况下需要用到不同的排序方法才能实现效率的最大化。冒泡法排序相对来说比选择法简单,由于冒泡法每次都要交换元素的顺序,而选择法则只需要记录元素的下标,因此冒泡法效率较低。对于数据较小的数组,运用冒泡法足以胜任,对于数据较大的数组,选择法排序的效率会明显提高。而快速排序法故名思义是目前最快的排序法,但是不够冒泡排序法稳定。

3.时间复杂度计算结果
在这里插入图片描述

五、实验小结
实验过程中,由于排序方面知识在数据结构中已学习过,故大多情况下没有问题,主要问题出现在对于一些函数的知识例如参数设置与调用等有些遗忘,但通过书本及网络工具可以很快的重新回忆起已学知识。

猜你喜欢

转载自blog.csdn.net/qq_43605229/article/details/126351988