归并排序原理:
是将两个有序数列再次进行排序后插入到数列中,使其形成一个有序的数列的过程,当然,假如要有两个有序数列本身条件就是很困难的,所以采用了分治法将数列进行不断切分,到最后每个小数列只存在一个元素,便可看作是有序,利用递归来求得最后的有序数列,其代码难度比别的几个排序大一些,在这里讲解大家可能无法理解,所以附上一些很不错的视频,大家可以去看看,视频讲的很清晰,很好理解。
视频链接:点击这里转到视频
下面是我敲的代码实现,使用C语言,已经过测试,大家可以参考:
代码实现:
#include <stdio.h> #include <malloc.h> #include <stdlib.h> void mergeSort(int arr[], int L, int R); int main( ) { int arr[6] = { 12,24,22,14,18,91 }; mergeSort(arr, 0, 5); for (int i = 0;i < 6;i++) { printf_s("%d\n", arr[i]); } /*int arr[8] = { 5,6,4,2,3,1}; mergeSort(arr, 0, 5); for (int i = 0;i < 6;i++) { printf_s("%d\n", arr[i]); }*/ } //L和R都是index,注意 void merge(int arr[], int L, int M, int R) { int Left_Size = M - L; int Right_Size = R - M + 1; //int Left[Left_Size]; int* Left = (int*)malloc(sizeof(int) * Left_Size); if (Left == nullptr) { exit(-1); } int* Right = (int*)malloc(sizeof(int) * Right_Size); if (Right == nullptr) { exit(-1); } //int i; for (int i = L;i < M;i++) { Left[i - L] = arr[i]; } for (int i = M;i <= R;i++) { Right[i-M] = arr[i]; } int i = 0,j = 0,k = L; while (i < Left_Size && j < Right_Size) { if (Left[i] < Right[j]) { arr[k] = Left[i]; i++; k++; } else { arr[k] = Right[j]; j++; k++; } } while (i < Left_Size) { arr[k] = Left[i]; i++; k++; } while (j < Right_Size) { arr[k] = Right[j]; j++; k++; } } //L和R都是index,注意 void mergeSort(int arr[], int L,int R) { if (L == R) { return; } else { int M = (L + R) / 2; mergeSort(arr, L, M); mergeSort(arr, M + 1, R); //这里第二个参数表示的是第二个数组第一个开头元素,所以我们要传入M+1 merge(arr, L, M+1, R); } }
算法时间复杂度为: O( nlogn ),具体推导我下一次更新。
浙公网安备 33010602011771号