排序算法总结

本文是对排序算法的总结,包括冒泡排序、选择排序、插入排序、归并排序和快速排序。详细介绍了每种排序算法的原理和特点,如冒泡排序的相邻元素比较交换,选择排序的最小元素与待排序部分第一个元素交换,插入排序的元素插入,归并排序的递归合并,以及快速排序的分区操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序算法汇总


    排序算法有冒泡排序、选择排序、插入排序、归并排序和快速排序。最近写了一下,在这里做一下总结。

    冒泡排序是最简单的排序算法之一,重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

void bubbleSort(int A[],int L)//A为数组头指针,L为数组长度
{
	for(int i = 0;i < L-1;i++)
	{
		for(int j = 0;j < L-1;j++)
		{
			if(A[j] > A[j+1])
			{
				int tmp = A[j];
				A[j] = A[j+1];
				A[j+1] = tmp;
			}
		}
	}
}

    选择排序是指,对一个序列A中的元素A[0]~A[L-1],令i 从0到L-1枚举,进行L趟操作,每趟从待排序部分[i,L-1]中选择最小的元素,令其与待排序部分的第一个元素A[i]进行交换,这样元素元素A[i]就会与当前有序区间[0,i-1]形成新的有序区间[0,i],于是在L趟操作后,所有元素都会是有序的。算法的复杂度为 O ( n 2 ) O(n^2) O(n2)

void selectSort(int A[],int L)
{
	for(int i = 0;i < L;i++)
	{
		int k = i;
		for(int j = i;j < L;j++)
		{
			if(A[j] < A[k])
			{
				k = j;
			}
		}
		int tmp = A[i];
		A[i] = A[k];
		A[k] = tmp;
	}
}

    插入排序中最简单的一类是是直接插入排序,直接插入排序是指,对序列A的L个元素A[0]至A[L-1],令i从1到L-1枚举,进行L-1趟操作。假设某一趟时,序列A的前i个元素A[0]至A[i-1]已经有序,而范围[i,L-1]还未有序,那么该趟从范围[0,i-1]中寻找某个位置j,是的将A[i]插入位置j后(此时A[j]到A[i-1]会后移一位至A[j+1]~A[i]),范围[0,i]有序。

void insertSort(int A[],int L)
{
	for(int i = 1;i < l;i++)
	{
		int j = i,tmp = A[i];
		
		while(j > 0 && A[j-L] > tmp)
		{
			A[j] = A[j-1];
			j--;
		}
		A[j] = tmp;
	}
}

    归并排序是一种基于“归并”思想的排序方法,其中,2-路归并排序是一种比较有代表性的归并排序算法。其原理是,将序列两两分组,将序列归并为n/2个组,组内单独排序;然后将这些组再两两归并,生成n/4个组,组内再单独排序;以此类推,知道剩下一个组为止。归并排序的时间复杂度为O(nlogn)。

void merge(int A[],int l1,int r1,int l2,int r2)
{
	int i = l1,j = l2,k = 0;
	int tmp[1010];
	while(i <= r1 && j <= r2)
	{
		if(A[i] < A[j])
		{
			tmp[k] = A[i];
			i++;
		}
		else
		{
			tmp[k] = A[j];
			j++;
		}
		k++;
	}
	while(i<=r1)tmp[k++] = A[i++];
	while(j<=r2)tmp[k++] = A[j++];

	for(int ii = l1;ii < l1 + k;ii++)
	{
		A[ii] = tmp[ii-l1];
	}
}

void mergeSort(int A[],int l,int r)
{
	if(l < r)
	{
		int mid = (l+r)/2;
		mergeSort(A,l,mid);
		mergeSort(A,mid+1,r);
		merge(A,l,mid,mid+1,r);
	}
}

    快速排序是排序算法中时间复杂度为O(nlogn)的一种算法,其实现需要先解决这样一个问题,对一个序列A[0]、A[1]、… 、A[L-1],调整序列中元素的位置,使得A[0](原序列的A[0])的左侧所以元素都不超过A[0]、右侧所有元素都大于A[0]。例如对序列{5,3,9,6,4,1}来说,可以调整序列中元素的位置,形成序列{3,1,4,5,9,6},这样就让A[0]=5左侧的所有元素都不超过它、右侧所有元素都大于它。

int partition(int A[],int left,int right)
{
	int tmp = A[left];
	while(left < right)
	{
		while(left < right && A[right] > tmp)right--;
		a[left] = a[right];
		while(left < right && A[left] <= tmp)left++;
		A[right] = A[left];
	}
	A[left] = tmp;
	return left;
}
void quickSort(int A[],int left,int right)
{
	if(left < right)
	{
		int pos = partition(A,left,right);
		quickSort(A,left,pos - 1);
		quickSort(A,pos + 1,right);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值