歸併排序:利用遞歸與分治的思想,先將數組對半劃分,再對半劃分的數組排序,從而使左右兩個子數組各自有序,最後再將兩排序號的子數組進行歸併成一個大的有序數組。
具體代碼如下:
#include <iostream>
#include <vector>
using namespace std;
void mergeSort(vector<int> &arr, int start, int end);
void merge(vector<int> &arr, int start1, int end1, int start2, int end2);
// 數組歸併排序
void mergeSort(vector<int> &arr, int start, int end)
{
int mid = start + (end - start)/2;
if (start < end)
{
mergeSort(arr, start, mid); // 左半部分遞歸歸併排序
mergeSort(arr, mid + 1, end); // 右半部分遞歸歸併排序
merge(arr, start, mid, mid + 1, end); // 將左、右分別各自有序的數組歸併
}
}
// 將兩個有序數組合併爲一個有序數組
void merge(vector<int> &arr, int start1, int end1, int start2, int end2)
{
// 構造輔助數組arr1,arr2;
vector<int> arr1, arr2;
int len1 = end1 - start1 + 1;
int len2 = end2 - start2 + 1;
int end = start1;
for (int i = 0; i < len1; i++)
{
arr1.push_back(arr[end]);
end++;
}
for (int i = 0; i < len2; i++)
{
arr2.push_back(arr[end]);
end++;
}
int pos = start1;
// 合併兩個有序數組
int i = 0;
int j = 0;
while (i < len1 && j < len2)
{
if (arr1[i] <= arr2[j])
{
arr[pos++] = arr1[i++];
}
else
{
arr[pos++] = arr2[j++];
}
}
if (i < len1)
{
while(i < len1)
{
arr[pos++] = arr1[i++];
}
}
if (j < len2)
{
while(j < len2)
{
arr[pos++] = arr2[j++];
j++;
pos++;
}
}
}
// 順序打印數組
void printArray(vector<int> &arr)
{
for (int i = 0; i < arr.size(); i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> array;
for(int i = 7; i >=0; i--)
{
array.push_back(i);
}
printf("排序前的數組爲:");
printArray(array);
mergeSort(array,0,array.size() - 1);
printf("排序後的數組爲:");
printArray(array);
return 0;
}
運行結果如下: