排序算法系列目录
排序算法第一讲 — 冒泡排序(Python、C++、C)
排序算法第二讲 — 选择排序(Python、C++、C)
排序算法第三讲 — 插入排序(Python、C++、C)
排序算法第四讲 — 快速排序(Python、C++、C)
排序算法第五讲 — 希尔排序(Python、C++、C)
排序算法第六讲 — 归并排序(Python、C++、C)
题目描述:
给你一个整数数组 nums,请你将该数组采用归并排序方式进行升序排列。
解题思路:
分治算法: 将一个比较大规模的问题分解成为若干个规模较小的问题,子问题的结构与性质和原问题的结构和性质必须要保持一致。
归并排序将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
- 把长度为n的输入序列分成两个长度为n/2的子序列;
- 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列。
代码:
Python写法:
[5,4,38,1] -> [5,1,4,38] -> [4,5,1,38] ->[1,4,5,38]
class Solution(object):
def solution(self, nums):
if len(nums) <= 1: return nums
mid = len(nums)//2
left = Solution.solution(self, nums[:mid])
right = Solution.solution(self, nums[mid:])
merged = []
while left and right:
if left[0] <= right[0]:
merged.append(left.pop(0))
else:
merged.append(right.pop(0))
merged.extend(right if right else left) # 递归
return merged
s = Solution()
nums = [5, 4, 38, 1]
s.solution(nums)
print(s.solution(nums))
C++写法:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
void Merge(int data[], int left, int mid, int right){
int i, j, k;
int *pd;
pd = (int *)malloc((right - left + 1) * sizeof(int));
i = left;
j = mid + 1;
k = 0;
while(i <= mid && j <= right) pd[k++] = data[i] < data[j] ? data[i++] : data[j++];
while(i <= mid) pd[k++] = data[i++];
while(j <= right) pd[k++] = data[j++];
for(k = 0, i = left; i <= right; i++, k++) data[i] = pd[k];
free(pd);
}
void MergeSort(int data[], int left, int right){
int mid;
if(left < right){
mid = (left + right) >> 1; //除2向下取整
MergeSort(data, left, mid); //递归
MergeSort(data, mid + 1, right);
Merge(data, left, mid, right);
}
}
int main(){
int nums[10] = {2, 1, 3, 4, 6, 5, 8, 7, 10, 9};
MergeSort(nums, 0, 9);
for(int i = 0; i <= 9; i++){
cout<<nums[i]<<" ";
}
cout<<"\n";
return 0;
}
C语言:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
void Merge(int data[], int left, int mid, int right){
int i, j, k;
int *pd;
pd = (int *)malloc((right - left + 1) * sizeof(int));
i = left;
j = mid + 1;
k = 0;
while(i <= mid && j <= right) pd[k++] = data[i] < data[j] ? data[i++] : data[j++];
while(i <= mid) pd[k++] = data[i++];
while(j <= right) pd[k++] = data[j++];
for(k = 0, i = left; i <= right; i++, k++) data[i] = pd[k];
free(pd);
}
void MergeSort(int data[], int left, int right){
int mid;
if(left < right){
mid = (left + right) >> 1; //除2向下取整
MergeSort(data, left, mid); //递归
MergeSort(data, mid + 1, right);
Merge(data, left, mid, right);
}
}
int main(){
int nums[10] = {2, 1, 3, 4, 6, 5, 8, 7, 10, 9};
MergeSort(nums, 0, 9);
for(int i = 0; i <= 9; i++){
printf("%d ",nums[i]);
}
printf("\n");
return 0;
}
题目来源: