C++: 7种排序 算法原理展示

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

#define MAX  10

using namespace std;
// 最大堆调整
void MaxHeapify(int *a, int i, int heapSize)
{
	int l = (i + 1) * 2 - 1;
	int r = (i + 1) * 2;
	int largest;

	if (l <= heapSize && a[l]>a[i])
		largest = l;
	else
		largest = i;

	if (r <= heapSize && a[r]>a[largest])
		largest = r;

	if (largest != i)
	{
		swap(a[i], a[largest]);
		MaxHeapify(a, largest, heapSize);
	}
}

// 创建最大堆
void BuildMaxHeap(int *a, int len)
{
	for (int i = len / 2 - 1; i >= 0; i--)
	{
		MaxHeapify(a, i, len - 1);
	}
}

// 堆排序
void HeapSort(int *a, int len)
{
	BuildMaxHeap(a, len);
	for (int i = len - 1; i>0; i--)
	{
		swap(a[0], a[i]);
		MaxHeapify(a, 0, i - 1);
	}
}
void QuickSort(int array[], int left, int right)
{
	if (left < right)
	{
		int pivot = array[left];
		int low = left;
		int high = right;
		while (low < high)
		{
			while (low < high && array[high] > pivot)
			{
				high--;
			}
			array[low] = array[high];
			while (low < high && array[low] < pivot)
			{
				low++;
			}
			array[high] = array[low];
		}
		array[low] = pivot;
		QuickSort(array, left, low - 1);
		QuickSort(array, low + 1, right);
	}
}

void Merge(int *a, int begin, int mid, int end)
{
	int len1 = mid - begin + 1;
	int len2 = end - mid;
	int *L = new int[len1 + 1];
	int *R = new int[len2 + 1];
	int i, j, k;

	for (i = 0; i<len1; i++)
		L[i] = a[begin + i];
	
	for (j = 0; j<len2; j++)
		R[j] = a[mid + j + 1];
	
	L[len1] = 10000000;
	R[len2] = 10000000;

	for (i = 0, j = 0, k = begin; k <= end; k++)
	{
		if (L[i] <= R[j])
			a[k] = L[i++];
		else
			a[k] = R[j++];

	}

	delete[]L;
	delete[]R;
}

void MergeSort(int array[], int begin, int end)
{
	if (begin < end)
	{
		int mid = (begin + end) / 2;
		MergeSort(array, begin, mid);
		MergeSort(array, mid + 1, end);
		Merge(array, begin, mid, end);
	}
}
void BubbleSort(int array[])
{
	for (int i = 0; i < MAX; i++)
	{
		for (int j = MAX-1; j > i; j--)
		{
			if (array[j] < array[j - 1])
			{
				int temp = array[j];
				array[j] = array[j - 1];
				array[j - 1] = temp;
			}
		}
	}
	cout << "The Bubble_sorted array is :" << endl;
	for (int i = 0; i < MAX; i++)
	{
		cout << array[i] << '\t';
	}
	cout << endl;

}
void SelectSort(int array[])
{
	for (int i = 0; i < MAX - 1; i++)
	{
		int current = array[i];
		int least = i;
		for (int j = i + 1; j < MAX; j++)
		{
			if (array[j] < current)
			{
				least = j;
				current = array[least];
			}
		}
		if (least != i)//swap
		{
			array[i] += array[least];
			array[least] = array[i] - array[least];
			array[i] = array[i] - array[least];
		}
	}
	cout << "The Select_sorted array is :" << endl;
	for (int i = 0; i < MAX; i++)
	{
		cout << array[i] << '\t';
	}
	cout << endl;

}
void ShellSort(int array[])
{
	int gap = 1;
	gap = (MAX / 3) * 3 + 1;
	while (gap > 0)
	{
		for (int j = gap; j < MAX; j++)
		{
			int current = array[j];
			int i = j - gap;
			while (array[i] > current && i >= 0)
			{
				array[i + gap] = array[i];
				i -= gap;
			}
			array[i + gap] = current;
		}
		gap /= 3;
	}
	cout << "The shell_sorted array is :" << endl;
	for (int i = 0; i < MAX; i++)
	{
		cout << array[i] << '\t';
	}
	cout << endl;

}

void InsertSort(int array[])
{
	for (int i = 1; i < MAX; i++)
	{
		int current = array[i];
		int j = i - 1;
		while (array[j] > current && j >= 0)
		{
			array[j + 1] = array[j];
			j--;
		}
		array[j+1] = current;
	}
	cout << "The insert_sorted array is :" << endl;
	for (int i = 0; i < MAX; i++)
	{
		cout << array[i] << '\t';
	}
	cout << endl;
}

int main()
{
	int Array[MAX];
	cout << "The initial array is :" << endl;
	for (int i = 0; i < MAX; i++)
	{
		Array[i] = rand()%100;
		cout << Array[i] << '\t';		
	}
	cout << endl;
	int TimeStart =int( GetTickCount());
	//InsertSort(Array);
	//ShellSort(Array);
	//SelectSort(Array);
	//BubbleSort(Array);
	//MergeSort(Array,0,MAX-1);
	//QuickSort(Array, 0, MAX - 1);
	HeapSort(Array, MAX); 
	cout << "The heap_sorted array is :" << endl;
	for (int i = 0; i < MAX; i++)
	{
		cout <<	Array[i] << '\t';
	}
	cout << endl;
	int TimeEnd = int(GetTickCount());
	cout << "The running time is " << TimeEnd - TimeStart << endl;
	system("PAUSE");
	return 0;
	
}

先贴上代码:(其中对排排序借鉴了http://blog.csdn.net/left_la/article/details/8657199)

后期完善算法总结及算法原理展示图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值