您现在的位置是:首页 >学无止境 >十大排序算法网站首页学无止境

十大排序算法

wjfdsklfdkfksd 2024-06-17 06:01:02
简介十大排序算法

十大排序算法的时间复杂度

1.冒泡排序

步骤:从头元素开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置,执行完一轮,最末尾的那个元素就是最大的元素

1.1冒泡算法

void BubbleSort(int arr[], size_t length)
{
	for (int end = length-1; end > 0; --end)//
	{
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[begin] > arr[begin +1])
			{
				int tmp = arr[begin];
				arr[begin] = arr[begin + 1];
				arr[begin + 1] = tmp;
			}
		}
	}
}

1.2优化1:如果已经完全有序,可以提前结束比较

void BubbleSort(int arr[], size_t length)
{
	for (int end = length - 1; end > 0; --end)//
	{
		bool bSorted = true;
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[begin] > arr[begin + 1])
			{
				int tmp = arr[begin];
				arr[begin] = arr[begin + 1];
				arr[begin + 1] = tmp;
				bSorted = false;
			}	
		}
		if (bSorted == true) break;//已经完全有序
	}
}

1.3 优化2:如果序列尾部已经局部有序,可以记录最后一次交换的位置,减少比较次数

尾部提前有序的情况

//冒泡排序的优化  如果序列尾部已经局部有序,可以记录最后一次交换的位置,减少比较次数
void BubbleSort(int arr[], size_t length)
{
	for (int end = length - 1; end > 0; --end)//
	{
		//为数组完全有序做准备的,只进行一次外循环就退出
		int iLastSortIndex = 1;
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[begin] > arr[begin + 1])
			{
				int tmp = arr[begin];
				arr[begin] = arr[begin + 1];
				arr[begin + 1] = tmp;
				iLastSortIndex = begin;//记录一下最后一次比较的位置
			}
		}
		end = iLastSortIndex;
	}
}

最坏,平均时间复杂度:O(n^2)
最好时间复杂度:O(n)经过一轮循环,如果是完全有序,可以提前退出。

算法稳定性

如果两个相等的元素,在排序前后的相对位置保持不变,就是稳定。
冒牌算法是稳定的排序算法,注意不要将 > 写成 >=

2.选择排序

执行流程:. 从序列中找到最大的那个元素,然后与最末尾的元素交换位置,最末尾的元素就是最大的元素

void  selectSort(int arr[], size_t length)
{
	for (int end = length - 1; end > 0; --end)//
	{
		int maxIndex = 0;
		for (int begin = 0; begin < end; ++begin)
		{
			if (arr[maxIndex] < arr[begin])
				maxIndex = begin;
		}
		//跟结尾进行交换
		int temp = arr[maxIndex];
		arr[maxIndex] = arr[end];
		arr[end] = temp;
	}
}

最好,最坏,平均时间复杂度是O(n^2)

3.堆排序

对选择排序的一种优化
执行流程

  • 对序列进行原地建堆 O(n)
  • 重复执行以下操作,直到堆的元素数量为1 执行n-1
    1. 交换堆顶元素与尾元素
    2. 堆的元素数量减1
    3. 对0位置进行1次下滤操作 O(logn)
    堆排序的时间复杂度O(n(logn))

4.快速排序

执行流程:
1.从序列中选择一个轴点(pivot)元素
假设每次选择0位置的元素为轴点元素
2.利用pivot元素将序列分割成2个子序列

  • 将小于pivot的元素放在pivot前面
  • 将大于pivot的元素放在pivot后面
  • 等于pivot的元素放在哪边都可以
    3.对子序列进行1,2操作
    直到不能分割(子序列只剩下1个元素)

快速排序的本质:逐渐将每个元素都转换成轴点元素

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。