您的位置:首页 > 编程语言 > C语言/C++

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

2014-08-19 19:15 363 查看
#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)

后期完善算法总结及算法原理展示图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: