数据结构排序-------归并排序(C,Java实现)
1、归并排序简要概述
(1)归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
2、归并排序图解
治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤:
3、代码实现
public class test {
public static void main(String[] args) {
int array[] = new int[]{8, 4, 5, 7, 1, 3, 6, 2};
int temp[] = new int[array.length];
System.out.print("归并排序前:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
mergeSort(array, 0, array.length - 1, temp);
System.out.println();
System.out.print("归并排序后:");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
public static void merge(int a[], int left, int right, int mid, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0; //指向temp数组
while (i <= mid && j <= right) {
if (a[i] <= a[j]) {
temp[t] = a[i];
t += 1;
i += 1;
} else {
temp[t] = a[j];
t += 1;
j += 1;
}
}
while (i <= mid) {
temp[t] = a[i];
t += 1;
i += 1;
}
while (j <= right) {
temp[t] = a[j];
t += 1;
j += 1;
}
t = 0;
int tempLeft = left;
while (tempLeft <= right) {
a[tempLeft] = temp[t];
t++;
tempLeft++;
}
}
public static void mergeSort(int a[], int left, int right, int[] temp) {
int mid = 0;
if (left < right) {
mid = (left + right) / 2;
//向左递归
mergeSort(a, left, mid, temp);
//向右递归
mergeSort(a, mid + 1, right, temp);
//合并
merge(a, left, right, mid, temp);
}
}
}
结果如下:
4、C代码实现
#include <stdio.h>
int main(int argc, char *argv[])
{
void merge(int a[], int left, int right, int mid, int temp[]);
void mergeSort(int a[], int left, int right, int temp[]);
int arr[]={8, 4, 5, 7, 1, 3, 6, 2};
//得到数组的长度
int length=sizeof(arr)/sizeof(arr[0]);
int temp[length];
printf("归并排序前:");
for (int i = 0; i < length; i++) {
printf("%d ",arr[i]);
}
mergeSort(arr, 0, length - 1, temp);
printf("\n");
printf("归并排序后:");
for (int i = 0; i < length; i++) {
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
void merge(int a[], int left, int right, int mid, int temp[]){
int i = left;
int j = mid + 1;
int t = 0; //指向temp数组
while (i <= mid && j <= right) {
if (a[i] <= a[j]) {
temp[t] = a[i];
t += 1;
i += 1;
} else {
temp[t] = a[j];
t += 1;
j += 1;
}
}
while (i <= mid) {
temp[t] = a[i];
t += 1;
i += 1;
}
while (j <= right) {
temp[t] = a[j];
t += 1;
j += 1;
}
t = 0;
int tempLeft = left;
while (tempLeft <= right) {
a[tempLeft] = temp[t];
t++;
tempLeft++;
}
}
void mergeSort(int a[], int left, int right, int temp[]){
void merge(int a[], int left, int right, int mid, int temp[]);
int mid = 0;
if (left < right) {
mid = (left + right) / 2;
//向左递归
mergeSort(a, left, mid, temp);
//向右递归
mergeSort(a, mid + 1, right, temp);
//合并
merge(a, left, right, mid, temp);
}
}
结果如下:
楠哥-------一心想为IT行业添砖加瓦,却总是面向cv编程的程序员。
谢谢阅读,无误点赞,有误还望评论区指正。