归并排序和冒泡排序
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;
}
}
}
今天也要好好学习呀~
以上是关于归并排序和冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章
七大排序算法(插排,希尔,选择排序,堆排,冒泡,快排,归并)--图文详解
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚