1. 程式人生 > >6種基本排序(C++實現)

6種基本排序(C++實現)

六種基本排序...包括氣泡排序,直接插入排序,直接選擇排序,希爾排序,歸併排序,快速排序.第七種堆排序目前理解的不是很好,未完成.

執行時間方便比較排序時間效率,N可以改變陣列元素個數方便測試,隨機數用來生成隨機陣列.

C++實現如下:

// arraySort.cpp : 陣列排序
//
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

const int N = 100;		//陣列元素個數
const int RAND = 1000;	//隨機數範圍
void sortMP(int a[], int n);	//氣泡排序
void sortZC(int a[], int n);	//直接插入排序
void sortZX(int a[], int n);	//直接選擇排序
void sortShell(int a[], int n);	//希爾排序
void sortKP(int a[], int l, int r);	//快速排序
void sortD(int a[], int n);		//堆排序(暫未完成)

void sortG(int a[], int low, int mid, int high, int temp[]);//歸併排序(合併)
void sortMerge(int a[], int low, int high, int temp[]);//歸併排序(遞迴) 主函式呼叫
void printarray(int a[],int n);	//列印陣列
int main()
{
	int a[N];
	srand((int)time(NULL));     //每次執行種子不同,生成不同的隨機數
	for (int i = 0; i < N; i++)
	{
		a[i] = rand() % RAND;
	}
	clock_t start_time = clock();

	sortMP(a, N);
	
	//sortZC(a, N);

	//sortZX(a, N);

	//sortShell(a, N);
	
	//   歸併排序
	/*
	int *p = new int[N];
	sortMerge(a, 0,N-1,p);
	cout<<"歸併排序結果: ";
	printarray(a, N);
	*/

	//	快速排序
	/*	
	sortKP(a,0,N-1);
	cout << "快速排序結果: ";
	printarray(a, N);
	*/
	//sortD(a, N); 暫未完成

	clock_t end_time = clock();
	cout << "執行時間: " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
	system("pause");
    return 0;
}

void sortMP(int a[], int n)//氣泡排序
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 1; j < n - i; j++)
			if (a[j - 1] < a[j])	//從大到小
				swap(a[j - 1], a[j]);
	}
	cout << "冒泡1排序結果: ";
	printarray(a, n);
	
	int flag = n;
	while (flag > 0)
	{
		int k = flag;
		flag = 0;
		for (int j = 1; j < k; j++)//從小到大
		{
			swap(a[j - 1], a[j]);
			flag = j;
		}
	}
	cout << "冒泡2排序結果: ";
	printarray(a, n);
}

void sortZC(int a[], int n)//直接插入排序
{
	for (int i = 1; i < n; i++)
	{
		int j = 0;
		if (a[i] < a[i - 1])
		{
			int temp = a[i];
			for (j = i - 1; j >= 0 && a[j] > temp; j--)
				a[j + 1] = a[j];
			a[j + 1] = temp;
		}
	}
	cout << "直接插入結果: ";
	printarray(a, n);
}

void sortZX(int a[], int n)	//直接選擇排序
{
	int min;
	for (int i = 0; i < n; i++)
	{
		min = i;
		for(int j=i+1;j<n;j++)
			if (a[j] < a[min])
			{
				min = j;
			}
		swap(a[i], a[min]);
	}
	cout << "直接選擇結果: ";
	printarray(a, n);
}

void sortShell(int a[], int n)//希爾排序
{
	/****** 本塊方便理解
	int gap;
	for (gap = n / 2; gap > 0; gap /= 2)
		for (int i = 0; i < gap; i++)
		{
			for (int j = i + gap; j < n; j += gap)
			{
				if (a[j] < a[j - gap])
				{
					int temp = a[j];
					int k = j - gap;
					while (k >= 0 && a[k] > temp)
					{
						a[k + gap] = a[k];
						k -= gap;
					}
					a[k + gap] = temp;
				}
			}
		}*/
	int gap;	//此塊分排序部分為冒泡思想
	for(gap =n/2;gap>0;gap/=2)
		for(int i=gap;i<n;i++)
			for (int j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
			{
				swap(a[j], a[j + gap]);
			}
	cout << "希爾排序結果: ";
	printarray(a, n);
}

void sortG(int a[], int low, int mid, int high, int temp[])//歸併排序(合併)
{
	int i, j, k;
	i = low;
	j = mid + 1;//避免重複比較a[mid]
	k = 0;
	while (i <= mid && j <= high)
	{
		if (a[i] <= a[j])
			temp[k++] = a[i++];
		else
			temp[k++] = a[j++];
	}
	while (i <= mid)
		temp[k++] = a[i++];
	while (j <= high)           //a[low,mid]已經全部歸入temp陣列,(mid,high]還有剩餘
		temp[k++] = a[j++];

	for (i = 0; i < k; i++)
		a[low + i] = temp[i];     //應從a[low+i]開始賦值
}

void sortMerge(int a[], int low, int high, int temp[])//歸併排序(遞迴) 主函式呼叫
{
	if (low < high)
	{
		int mid = (low + high) / 2;
		sortMerge(a, low, mid, temp);      //左邊有序
		sortMerge(a, mid + 1, high, temp);   //右邊有序
		sortG(a, low, mid, high, temp);     //合併
	}
}

void sortKP(int a[], int l, int r)	//快速排序
{
	if (l < r)
	{
		int i = l, j = r, x = a[l];
		while (i < j)
		{
			while (i < j&&a[j] >= x)
				j--;
			if (i < j)
				a[i++] = a[j];

			while (i < j&&a[i] < x)
				i++;
			if (i < j)
				a[j--] = a[i];
		}
		a[i] = x;
		sortKP(a, l, i - 1);	//左
		sortKP(a, i + 1, r);	//右
	}
}

void sortD(int a[], int n)		//堆排序(未完成)
{

}

void printarray(int a[],int n)	//列印函式
{
	for (int i = 0; i < n; i++)
		cout << a[i] << " ";
	cout << endl;
}