排序算法

本文深入探讨了五种经典的排序算法:冒泡排序、选择排序、插入排序、希尔排序和快速排序。每种算法都附有详细的伪代码,帮助读者理解其工作原理和实现过程。文章适合计算机科学领域的学生和专业人员阅读,旨在提高对数据结构和算法的理解。

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

1.冒泡排序

void BubbleOnce(int a[], int n)//排一趟,前n个元素
{
	int temp=0;
	for (int i = 0; i < n - 1; i++)
	{
		if (a[i] > a[i + 1])
		{
			temp = a[i];
			a[i] = a[i + 1];
			a[i + 1] = temp;
		}
	}
}
void BubbleSort(int a[],int length)
{
	for (int i = length; i > 0; i--)//从n个长度到第一个元素对应的第一个长度
		BubbleOnce(a, i);
}

2.选择排序

int FindMaxIndex(int a[], int n)
{
	int max = a[0];
	int maxi = 0;
	for (int i = 0; i < n; i++)
	{
		if (a[i] > max)
		{
			max = a[i];
			maxi = i;
		}
	}
	return maxi;//返回index而不是值
}
void SelectSort(int a[],int n)
{
	for (int i = 0;i<n;i++)
	{
		int maxi= FindMaxIndex(a,n-i);//当前最大元素的index
		int tmp = a[n - i - 1];//最大元素与当前数组最后元素交换
		a[n - i - 1] = a[maxi];
		a[maxi] = tmp;
	}
}

3.插入排序

void InsertSort(int A[], int N)
{
	int j, P;
	int Tmp;

	for (P = 1; P < N; P++)
	{
		Tmp = A[P];//从第1下标元素开始,从左往右
        //如果左边的元素 比tmp位置元素大,则:
		for (j=P;j>0&&A[j-1]>Tmp;j--)
		{
            //左边元素的值赋给右边元素,直到某个位置左边元素比tmp小,则
			A[j] = A[j - 1];
		}
		A[j] = Tmp;//将tmp值插入该位置
		for (int i = 0; i < N; i++)
		{
			printf_s("%d\t", A[i]);
		}
	}
	printf_s("\n");
}

4.希尔排序


void ShellSort(int A[],int N)
{
	int i, j, Increment;
	int Tmp;
	for (Increment = N / 2; Increment > 0; Increment = Increment / 2)
	{		
		for (i= Increment; i < N; i++)
		{			
			Tmp = A[i];
			for (j = i; j >= Increment; j = j - Increment)
			{					
				if (Tmp < A[j - Increment])
				{
					A[j] = A[j - Increment];
				}
				else
				{														
					break;
				}
			}			
			A[j] = Tmp;
			for (int i = 0; i < N; i++)
			{
				printf_s("%d\t", A[i]);
			}
		}
	}
}

5.快速排序


void QuickSort(int* arr, int L, int R)
{
	int pleft = L;
	int pRight = R;
	int poi = arr[(L + R) / 2];
	while (pleft < pRight)
	{
		while (pleft < pRight&&arr[pleft] < poi)//没有等号
		{
			pleft++;
		}
		while (pRight > pleft&&arr[pRight] > poi)//没有等号
		{
			pRight--;
		}
		if (pleft <= pRight)//有等号
		{
			int temp = arr[pleft];
			arr[pleft] = arr[pRight];
			arr[pRight] = temp;
			pleft++;//再移动1次
			pRight--;//再移动1次
		}
	}	
	if (L < pRight)//定义出口,没有等号
	{
		QuickSort(arr, L, pRight);
	}
	if (pleft < R)//定义出口,没有等号
	{
		QuickSort(arr, pleft, R);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值