堆排序
#include
#include
using namespace std;
void Swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void Heap_build(int a[],int root,int length)
{
int lchild = root * 2 + 1;
if (lchild < length)
{
int flag = lchild;
int rchild = lchild + 1;
if (rchild < length)
{
if (a[rchild] > a[flag])
{
flag = rchild;
}
}
if (a[root] < a[flag])
{
Swap(a[root], a[flag]);
Heap_build(a, flag, length);
}
}
}
void Heap_sort(int a[], int len){
for (int i = len / 2; i >= 0; --i) {
Heap_build(a, i, len);
}
for (int j = len-1; j > 0; --j) {
Swap(a[0], a[j]);
Heap_build(a, 0, j);
}
}
int main()
{
int a[10] = {12, 45, 748, 12, 56, 3, 89, 4, 48, 2};
Heap_sort(a, 10);
for (size_t i = 0; i != 10; ++i){
cout << a[i] << " ";
}
return 0;
}
归并排序
#include
void Merge(int A[], int left, int mid, int right)
{
int len = right - left + 1;
int temp[len];
int index = 0;
int i = left;
int j = mid + 1;
while (i <= mid && j <= right)
{
temp[index++] = A[i] <= A[j] ? A[i++] : A[j++];
}
while (i <= mid)
{
temp[index++] = A[i++];
}
while (j <= right)
{
temp[index++] = A[j++];
}
for (int k = 0; k < len; k++)
{
A[left++] = temp[k];
}
}
void MergeSortRecursion(int A[], int left, int right)
{
if (left == right)
return;
int mid = (left + right) / 2;
MergeSortRecursion(A, left, mid);
MergeSortRecursion(A, mid + 1, right);
Merge(A, left, mid, right);
}
void MergeSortIteration(int A[], int len)
{
int left, mid, right;
for (int i = 1; i < len; i *= 2)
{
left = 0;
while (left + i < len)
{
mid = left + i - 1;
right = mid + i < len ? mid + i : len - 1;
Merge(A, left, mid, right);
left = right + 1;
}
}
}
int main()
{
int A1[] = { 6, 5, 3, 1, 8, 7, 2, 4 };
int A2[] = { 6, 5, 3, 1, 8, 7, 2, 4 };
int n1 = sizeof(A1) / sizeof(int);
int n2 = sizeof(A2) / sizeof(int);
MergeSortRecursion(A1, 0, n1 - 1);
MergeSortIteration(A2, n2);
printf("递归实现的归并排序结果:");
for (int i = 0; i < n1; i++)
{
printf("%d ", A1[i]);
}
printf("\n");
printf("非递归实现的归并排序结果:");
for (int i = 0; i < n2; i++)
{
printf("%d ", A2[i]);
}
printf("\n");
return 0;
}
快速排序
#include
#include
#include
using namespace std;
int Partition(vector<int>& nums, int left, int right){
int pivot = nums[right];
int tail = left - 1;
for(int i = left; i < right; ++i){
if(nums[i] <= pivot){
++tail;
if(tail != i){
swap(nums[tail], nums[i]);
}
}
}
swap(nums[tail + 1], nums[right]);
return tail + 1;
}
void QuickSort(vector<int>& nums, int left, int right){
if(left > right){
return;
}
int pivot_index = Partition(nums, left, right);
QuickSort(nums, left, pivot_index - 1);
QuickSort(nums, pivot_index + 1, right);
}
int main()
{
int A[] = {5, 2, 9, 4, 7, 6, 1, 3, 8};
int n = sizeof(A) / sizeof(int);
vector<int> nums(A, A + n);
QuickSort(nums, 0, n - 1);
cout << "快速排序结果:";
for(int i = 0; i < nums.size(); ++i){
cout << nums[i] << " ";
}
return 0;
}