數組的歸併排序

歸併排序:利用遞歸與分治的思想,先將數組對半劃分,再對半劃分的數組排序,從而使左右兩個子數組各自有序,最後再將兩排序號的子數組進行歸併成一個大的有序數組。

具體代碼如下:

#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;	
}

運行結果如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章