原文:https://blog.csdn.net/David_Dai_1108/article/details/67690405
冒泡排序
-
冒泡排序的可视化图:
-
冒泡排序的概念:冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直至没有反序的记录为止。因为按照该算法,每次比较会将当前未排序的记录序列中最小的关键字移至未排序的记录序列最前(或者将当前未排序的记录序列中最大的关键字移至未排序的记录序列最后),就像冒泡一样,故以此为名。
-
冒泡排序算法的算法描述如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
-
冒泡排序的代码实现:
static void BubbleSort(int[] arr)
{
int temp = 0;
bool isSwapped = false;
for (int m = 0; m < arr.Length - 1; ++m)
{
for (int i = 0; i < arr.Length - 1 - m; ++i)
{
if (arr[i] > arr[i + 1])
{
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
if (!isSwapped)
isSwapped = true;
}
}
if (!isSwapped)
return;
}
}
- 冒泡排序的复杂度:
- 时间复杂度
$O(n^{2})$
- 最优时间复杂度
$O(n)$
- 平均时间复杂度
$O(n^{2})$
- 空间复杂度:总共
$O(n)$
,辅助空间:$O(1)$
- 时间复杂度
鸡尾酒排序
-
鸡尾酒排序的可视化图:
-
鸡尾酒排序的概念:鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序(也可以视作选择排序的一种变形),涟漪排序,来回排序或快乐小时排序,是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
-
鸡尾酒排序的算法描述如下:
- 先对数组从左到右进行升序的冒泡排序;
- 再对数组进行从右到左的降序的冒泡排序;
- 以此类推,持续的、依次的改变冒泡的方向,并不断缩小没有排序的数组范围;
-
鸡尾酒排序代码实现:
static void CocktailSort(int[] arr)
{
int i, temp, left = 0, right = arr.Length - 1;
while (left < right) {
for (i = left; i < right; i++) {
if (arr[i] > arr[i + 1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
right--;
for (i = right; i > left; i--)
{
if (arr[i - 1] > arr[i])
{
temp = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = temp;
}
}
left++;
}
}
- 鸡尾酒排序复杂度:
- 时间复杂度
$O(n^{2})$
- 最优时间复杂度
$O(n)$
- 平均时间复杂度
$O(n^{2})$
- 时间复杂度
快速排序
-
快速排序的可视化图:
-
快速排序的概念:又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n)算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
-
快速排序算法的算法描述如下:
- 从数列中挑出一个元素,称为”基准”(pivot),
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
-
快速排序的代码实现:
public static void QuickSort(int[] arr)
{
QuickSort(arr, 0, arr.Length - 1);
}
private static void QuickSort(int[] arr, int left, int right)
{
if (left < right)
{
int middle = arr[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
while (arr[++i] < middle) ;
while (arr[--j] > middle) ;
if (i >= j)
break;
Swap(arr, i, j);
}
QuickSort(arr, left, i - 1);
QuickSort(arr, j + 1, right);
}
}
private static void Swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
- 快速排序的复杂度:
- 时间复杂度
$O(n^{2})$
- 最优时间复杂度
$n\log n$
- 平均时间复杂度
$n\log n$
- 空间复杂度: 根据实现的方式不同而不同
- 时间复杂度