归并排序和快排猎豹网校的讲的不好,他用的是技巧,比如给数组多加一个元素之类的,但是我要学通用的方法之后再学技巧。
- 快速排序将无序的元素序列分成两个无序的元素序列的过程中,很有可能是不稳定的(大小西相同的数据排序完相对位置发生了改变)
- 寻找一个即突破O(n2)又是稳定的算法,归并算法为了变成一个稳定的算法,他牺牲了空间,把有序的序列考到了一个新的序列里面。
- 多路归并:将多个有序的序列合成一个有序的序列
#include <iostream>
#include <algorithm>
#define MAXSIZE 1000
using namespace std;
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void Merge(int src[], int des[], int low, int mid, int high)
//归并的过程
//src是数组,des是目的地
{
int i = low;
int j = mid + 1;
int k = low;
while ((i <= mid) && (j <= high))//将小的放到目的地中
//这个如果没有等于号就不是稳定排序
{
if (src[i] < src[j]) des[k++] = src[i++];
else des[k++] = src[j++];
}
while (i <= mid)//若还剩几个尾部元素
des[k++] = src[i++];
while (j <= high)//若还剩几个尾部元素
des[k++] = src[j++];
}
//每次兵分两路,当只剩下一个元素时,就不需要再划分
void Msort(int src[], int des[], int low, int high, int max)
//划分的过程
{
if (low == high)//只有一个元素,不用归并,结果赋给des[low]
des[low] = src[low];
else //如果两个元素,进行二路划分
{
int mid = (low + high) / 2;
int TR2[MAXSIZE+1];//辅助数组
//递归进行两路两路的划分
//当剩下一个元素的时候,递归划分结束,然后开始merge归并操作
Msort(src, TR2, low, mid, max);
Msort(src, TR2, mid + 1, high, max);
Merge(TR2, des, low, mid, high);//调用归并函数进行归并
}
}
void MergeSort(int array[], int len)
{
Msort(array, array, 0, len - 1, len);
//Msort(原数组,目标数组,原数组中的最低位和最高位,长度)
}
int main()
{
int array[] = { 12, 5, 433, 7, 98, 32, 11, 8, 2, 56 };
int len = sizeof(array) / sizeof(*array);
cout << "before sorting:" << endl;
for (int i = 0; i <len; ++i)
{
cout << array[i] << " ";
}
cout << endl;
MergeSort(array, len);
cout << "after sorting:" << endl;
for (int i = 0; i <len; ++i)
{
cout << array[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
比较好的参考:
https://blog.csdn.net/li528405176/article/details/86615003?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.not_use_machine_learn_pai
https://www.jianshu.com/p/591b96c32cc8