算法思路:
卡牌算法
比如我现在左手又5张已经排好序的扑克牌,右手6张已经排好序扑克牌,让我们把左手和右手的扑克牌合并成一个排好序的扑克牌,相信这个排序大家都会。就是先左手第一张和右手第一张比,看谁小,小的拿出来,放座子上。就按这种排序方法。显而易见,它的时间时间复杂度就是O(n);
通过卡牌算法我们知道了,只要得到了俩个有序的序列,把他俩合并成另一个有序序列就很容易,并且很省时间
归并排序用的就是这个想法!!!!!
归
根据卡牌算法,我们要得到有序的序列,在一个无序的序列中,当序列元素为1时,它肯定时有序序列,所以我们要用递归的方法,一直递归它序列的长度为1,那么现在就存在有序序列了。
就像上面图示一样,已经递归到了每个序列的长度为1了
并
得到了有序序列之后,我们要对俩个有序序列进行合并了!!
小的在前 大的在后 一直进行次操作 知道序列的长度已经为刚开始的长度为止!!!
算法实现
#include <iostream> using namespace std; //二路归并排序 const int N = 1e5 + 5; int a[N], t[N]; void Merge(int a[], int low, int mid, int high); void MergeSort(int a[], int low, int high); int main() { cin >> a[0]; for (int i = 1; i <= a[0];i++) { cin >> a[i]; } MergeSort(a, 1, a[0]); cout << js<<endl; return 0; } void Merge(int a[], int low, int mid, int high) {//并!!!!!!!! int i = low, j = mid + 1, k = low; while (i <= mid && j <= high) { if (a[i] > a[j]) { t[k++] = a[j++]; } else t[k++] = a[i++]; } while (i <= mid) { t[k++] = a[i++]; } while (j <= high) { t[k++] = a[j++]; } for (int m = low; m <= high; m++) {//t为临时数组 存储a的数据 a[m] =t[m]; } } void MergeSort(int a[], int low, int high) {//归!!!!!!!!! if (low == high) return;//递归的结束条件 //前进 int mid = (low + high) / 2; MergeSort(a, low, mid); MergeSort(a, mid + 1, high); //回退 Merge(a, low, mid, high); }