冒泡排序,插入排序,选择排序和快速排序-C语言

这篇博客介绍了四种基本排序算法:冒泡排序、插入排序、选择排序和快速排序。文章详细阐述了每种排序算法的工作原理,包括它们的时间复杂度和适用场景。冒泡排序在大数据量时效率低下,而快速排序则以其高效的性能脱颖而出。插入排序通过逐步找到元素的正确位置实现排序,而选择排序则是寻找最小元素并将其放到正确位置。快速排序通过选取基准元素并重新组织数组达到排序目的。
摘要由CSDN通过智能技术生成

这篇博文主要用于自己学习的文章梳理,方便以后回忆。

First,冒泡排序, 算法的时间复杂度是N*N  ,在数据较多的时候,和快速排序比较运行时间,简直慢的掉渣,

冒泡排序的思想,主要是相邻两个元素比较,如果前一个元素比后一个元素大,则进行交换,否则继续后移,知道一次循环结束,此时最后一个元素是序列中最大的元素。

每一个趟将一个元素像冒泡一样冒出,进行n-1此循环后,序列有序。

冒泡排序主要两个FOR循环的边界。

void bubble(int *a,int len)
{
	int i,j;
	int temp;
	for (i=0;i<len-1;++i)
	{
		for (j=0;j<len-i-1;j++)
		{
			if (a[j]>a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}

}

Second,插入排序。

插入排序的主要思想是假设初始序列只有一个元素,这个元素肯定有序,每次向序列里插入一个元素,找到元素合适的位置,然后进行插入。

插入排序的核心部分就是找到该元素合适的位置。

可以将带插入的元素和 有序序列最后比较,如果比最后一个元素大,直接插入最后一个元素后面,如果比最后一个元素小,则将最后一个元素后移,知道找到合适的位置停止。

最后将待插入的元素插入到适当的位置上。

void insert(int *a,int len)
{
	int i,j;
	int temp;
	for(i=1;i<len;i++)
	{
		temp=a[i];
		for(j=i-1;j>=0;--j)
		{
			if(a[j]>temp)   //小于当前元素  元素后移
			{
				a[j+1]=a[j];
			}
			else      //大于当前元素  停止内循环
			{
				break;
			}
		}
		a[j+1]=temp;
	}
}

Third,选择排序,正如这种排序的名字一样,每次遍历非有序的序列,找出最小元素,放入到合适的位置上。

初始假设第一个元素有效,然后与第一个元素后面的每个元素比较,每找到比此元素小的元素,进行交换,一趟循环后,初始元素肯定是最小的。

然后依次类推,排序后面的元素。

void select(int *a,int len)
{
	int i,j;
	int temp;
	for(i=0;i<len-1;++i)
	{
		for(j=i+1;j<len;++j)
		{
			if(a[i]>a[j])
			{
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}

}
Fourth,快速排序, 一个优秀的排序,还是有点回答不上来当时导师问的那个问题,为什么快速排序比别的排序要快?

只能说一下算法的大概思想了,让导师失望了,找到一个pivot,然后通过比较后,使pivot前面的元素比它小,后面的元素比它大, 然后对前半段和后半段递归的调用程序,

int  quicksort(int *a,int low,int high)
{
	int i = low;
	int j = high;  
	int temp = a[i]; 
	if( i < j)
	{          
		while(i < j) 
		{
			while((a[j] >= temp) && (i < j))
			{ 
				j--; 
			}
			a[i] = a[j];
			while((a[i] <= temp) && (i < j))
			{
				i++; 
			}  
			a[j]= a[i];
		}
		a[i] = temp;

// 		quicksort(a,low,i-1);
// 		quicksort(a,j+1,high);   //递归调用函数
	}
	return i;  //分割点 i=j;
}
最后 。通过快速排序 ,产生了一个元素序列的划分,想一下,如果在倒数第十个元素前面的都比它小,后面的都比他大,则后面的十个元素就是最大的元素,则不需要每次遍历整个序列找出最大元素输出。

下面的代码是找到打印最大K个元素的的起点。

int find_top(int *a,int len,int count)
{
	int part;
	int pos=len-count;    //top—k的打印起点
	part= quicksort(a,0, len - 1); //一次快排 返回分割点
	while(part != pos)
	{
		if(part > pos)    //分割点在位置之后  应该往前查找
		{
		part = quicksort(a,0, part - 1   );
		printf("%d\n", part);
		}
		else 
		{
		part = quicksort(a , part + 1, len - 1);
		printf("%d\n", part);
		}
	}

	return part;
}

最后放上测试代码:

#include "superman.h"
int main(int argc,char *argv[])
{
	int i,n=1;
	int part;
	int test[SIZE];
	//int *test=(int *)calloc(SIZE,sizeof(int));
	//srand(time(NULL));
	for(i=0;i<SIZE;++i)
	{
		test[i]=rand()%100;
	}
	printf("nowadays the array is waiting to sort...........:\n");
	for (i=0;i<SIZE;++i)
	{
		printf("%d ",test[i]);
	}
	printf("\n");
	printf("******************all_sort**********************\n");
	printf("******************1:bubble_sort*****************\n");
	printf("******************2:insert_sort*****************\n");
	printf("******************3:select_sort*****************\n");
	printf("******************4:quick_sort******************\n");
	printf("******************updating......****************\n");
// 	bubble(test,SIZE);
// 	printf("bubble over!\n");
// 
// 	select(test,SIZE);
// 	printf("select over!\n");
// 
// 	quick(test,SIZE);
// 	printf("quick over!\n");
// 
// 	insert(test,SIZE);
// 	printf("insert over!\n");
	
	
	while(fflush(stdin),printf("please input the number to select sort :"),scanf("%d",&n)!=EOF)
	{
		
		//printf("\n");
		//scanf("%d",&n);
		switch(n)
		{
		case 1:
			bubble(test,SIZE);
			show(test,SIZE);
			break;
		case 2:
			insert(test,SIZE);
			show(test,SIZE);
			break;
		case 3:
			select(test,SIZE);
			show(test,SIZE);
			break;
		case 4:
			part=find_top(test,SIZE,5);
			for(i=part;part<SIZE;part++)
			{
				printf("%d ",test[part]);
			}
 			//quicksort(test,0,SIZE-1);
 			//show(test,SIZE);
			break;
		default:
			printf("Error!\n");
			break;
		}
	}

	system("pause");
	return 0;
}




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值