归并排序和冒泡排序

Posted 小鹿可可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序和冒泡排序相关的知识,希望对你有一定的参考价值。

1. 二路归并排序

1.1排序思想

非递归形式:
将两段有序的数据合并成一段有序的数据,直到所有的数据有序。
时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定

1.2排序图解

递归图解:
在这里插入图片描述
非递归:
L1和L2 比较并向后走,小的放下去
在这里插入图片描述

1.3代码实现

//一次归并 以gapgap合并
static void Merge(int arr[], int len, int gap)//gap 标志几几合并
{
	int *brr = (int*)malloc(sizeof(int)* len);
	assert(brr != NULL);
	int low1 = 0;
	int high1 = low1 + gap - 1;
	int low2 = high1 + 1;
	int high2 = low2 + gap - 1<len ? low2 + gap - 1 : len - 1;//H2 有可能越界
	int i = 0;


	while (low2 < len)//有两个有序段 
	{
		while (low1 <= high1 && low2 <= high2)//两个段内头指针都没走到尾巴
		{
			if (arr[low1] <= arr[low2])
			{
				brr[i++] = arr[low1++];
			}
			else
			{
				brr[i++] = arr[low2++];
			}
		}
		//左边的段走到尾,那直接将右边的段内数据向下拷贝到brr内即可
		while (low2 <= high2)
		{
			brr[i++] = arr[low2++];
		}
		//右边的段走到尾,那直接将左边的段内数据向下拷贝到brr内即可
		while (low1 <= high1)
		{
			brr[i++] = arr[low1++];
		}

		//更改L1L2 H1H1,让指向接下来的两个有序段即可 
		low1 = high2 + 1;
		high1 = low1 + gap - 1;
		low2 = high1 + 1;
		high2 = low2 + gap - 1<len ? low2 + gap - 1 : len - 1;
	}
	//只有一个有序段
	while (low1 < len)
	{
		brr[i++] = arr[low1++];
	}

	//将brr里的全部值拷贝到arr里面,然后将brr释放
	for (int j = 0; j<len; j++)
	{
		arr[j] = brr[j];
	}
	free(brr);
	brr = NULL;
}

void MergeSort(int arr[], int len)
{
	assert(arr != NULL);
	if (NULL == arr)
		return;

	for (int i = 1; i<len; i *= 2)
	{
		Merge(arr, len, i);
	}
}

2.冒泡(沉石)排序

2.1排序思想

两两比较,大的向后挪,小的向前挪
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定

2.2排序图解

在这里插入图片描述
数据已经有序时候,不再循环,排序结束
在这里插入图片描述

2.3代码实现

void BubbleSort(int arr[], int len)
{
	//assert
	assert(arr != NULL);
	if (NULL == arr)
		return;
	bool tag = true;
	int tmp = 0;
	for (int i = 0; i < len - 1; i++)//两两比较,大的向后挪
	{
		for (int j = 0; j + 1 < len - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				tag = false;
			}
		}
		if (tag)
		{
			break;
		}
	}
}


今天也要好好学习呀~

以上是关于归并排序和冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

七大排序算法(插排,希尔,选择排序,堆排,冒泡,快排,归并)--图文详解

直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

有啥算法是相邻交换排序的(除了冒泡以外)

冒泡排序,插入排序,归并排序,快速排序的学习笔记

C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)