常用排序算法实践
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
- 堆排序
#include <iostream>
using namespace std;
#include<vector>
#include<algorithm>
void swap(vector<int> &array, int first, int second)
{
int temp;
temp = array[first];
array[first] = array[second];
array[second] = temp;
}
void Printf(vector<int> &array)
{
for (vector<int>::iterator it = array.begin(); it != array.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void BubbleSort(vector<int> &array,int size)
{
if (size < 2) return;
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size - 1 - i; j++)
{
if (array[j] > array[j+1])
{
swap(array, j, j+1);
}
}
}
}
void SelectSort(vector<int> &array, int size)
{
if (size < 2) return;
for (int i = 0; i < size-1; i++)
{
int max = i;
for (int j = i+1; j < size; j++)
{
if (array[max] < array[j])
{
max = j;
}
}
if (max != i)
swap(array, i, max);
}
}
void InsertSort(vector<int> &array, int size)
{
for (int i = 1; i < size; i++)
{
int temp = array[i];
int j;
for (j = i - 1; j >= 0 && temp > array[j]; j--)
{
array[j + 1] = array[j];
}
array[j + 1] = temp;
}
}
void insert(vector<int> &array, int step, int size)
{
for (int i = step; i < size; i++)
{
int temp = array[i];
int j;
for (j = i - step; j >= 0 && temp<array[j]; j -= step)
{
array[j + step] = array[j];
}
array[j + step] = temp;
}
}
void ShellSort(vector<int> &array, int size)
{
for (int step = size / 2; step > 0; step /= 2)
insert(array, step, size);
}
void Merge(vector<int> &arr, int start, int mid, int end)
{
int N = end - start + 1;
int* tmp = new int[N];
for (int k = start; k <= end; k++)
tmp[k - start] = arr[k];
int left = start;
int right = mid + 1;
for (int step = start; step <= end; step++)
{
if (left > mid)
{
arr[step] = tmp[right - start];
right++;
}
else if (right > end)
{
arr[step] = tmp[left - start];
left++;
}
else if (tmp[left - start] <= tmp[right - start])
{
arr[step] = tmp[left - start];
left++;
}
else
{
arr[step] = tmp[right - start];
right++;
}
}
}
void MregeSort(vector<int> &array, int start,int end)
{
if (start == end)
return;
int mid = (start + end) / 2;
MregeSort(array, start, mid);
MregeSort(array, mid + 1, end);
Merge(array, start, mid, end);
}
void QuickSort(vector<int> &array, int start,int end)
{
if (start >= end) return;
int left = start;
int right = end;
int base = array[start];
while (left < right)
{
while (array[right] <= base && left < right)
{
right--;
}
swap(array, left, right);
while (array[left] >= base && left < right)
{
left++;
}
swap(array, left, right);
}
QuickSort(array, start, left - 1);
QuickSort(array, left + 1, end);
}
void Find(vector<int> &array, int father,int size)
{
int temp = array[father];
for (int child = 2 * father + 1; child < size; child = 2 * child + 1)
{
if (child + 1 < size && array[child] < array[child + 1])
child++;
if (temp < array[child])
{
swap(array, father, child);
father = child;
}
else
break;
}
}
void HeapSort(vector<int> &array,int size)
{
for (int i = ((size - 1) - 1) / 2; i >= 0; i--)
Find(array, i, size);
for (int j = size - 1; j >0; j--)
{
swap(array, 0, j);
Find(array, 0, j);
}
}
void test(void)
{
vector<int> T = {
2, 4, 3, 5, 6 };
Printf(T);
}
void main()
{
vector<int> Array = {
5, 6, 2, 7, 9, 3, 1 };
HeapSort(Array, Array.size());
Printf(Array);
system("pause");
return;
}