#include"stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
/*-----------------各大排序算法-------------------*/
void swap_elem(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
/*--------冒泡排序------时间:n2 空间:1 稳定--------*/
void bubblesort(int *arr, int n)
{
if (arr == NULL || n <= 0)
return;
int flag = 1;
for (int i = 0; i < n -1 && flag; i++)
{
flag = 0;
for (int j = 0; j < n - 1 - i; j++)
{
if (arr[j]>arr[j + 1])
{
swap_elem(arr[j], arr[j + 1]);
flag = 1;
}
}
}
}
/*--------选择排序------时间:n2 空间:1 不稳定--------*/
void selectsort(int *arr, int n)
{
if (arr == NULL || n <= 0)
return;
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (arr[i] > arr[j])
{
swap_elem(arr[i], arr[j]);
}
}
}
}
/*--------插入排序------时间:n2 空间:1 稳定--------*/
void insertsort(int *arr, int n)
{
if (arr == NULL || n <= 0)
return;
for (int i = 1; i < n ; i++)
{
int temp = arr[i], preindex = i - 1;
while (preindex >= 0 && arr[preindex] > temp)
{
arr[preindex + 1] = arr[preindex];
preindex--;
}
arr[preindex + 1] = temp;
}
}
/*--------插入排序------时间:n2 空间:1 稳定--------*/
void Shellsort(int *arr, int n)
{
if (arr == NULL || n <= 0)
return;
for (int i = 1; i < n; i++)
{
int temp = arr[i], preindex = i - 1;
while (preindex >= 0 && arr[preindex] > temp)
{
arr[preindex + 1] = arr[preindex];
preindex--;
}
arr[preindex + 1] = temp;
}
}
/*--------快速排序------时间:nlogn 空间:nlogn 不稳定--------*/
void quicksort(int *arr, int left, int right)
{
if (left < right)
{
int i = left, j = right, temp = arr[i];
while (i < j)
{
while (i<j && arr[j] >= temp) j--;
if (i < j) arr[i++] = arr[j];
while (i < j && arr[i] <= temp) i++;
if (i < j) arr[j--] = arr[i];
}
arr[i] = temp;
quicksort(arr, left, i-1);
quicksort(arr, i+1, right);
}
}
/*--------归并排序------时间:nlogn 空间:n 稳定--------*/
void merge(int *arr, int *temp, int start, int end)
{
if (start >= end)
return;
int mid = (start + end) / 2;
int leftstart = start, leftend = mid;
int rightstart = mid + 1, rightend = end;
merge(arr, temp, leftstart, leftend);
merge(arr, temp, rightstart, rightend);
int k = start;
while (leftstart <= leftend && rightstart <= rightend)
{
temp[k++] = (arr[leftstart] < arr[rightstart]) ? arr[leftstart++] : arr[rightstart++];
}
while (leftstart <= leftend)
temp[k++] = arr[leftstart++];
while (rightstart <= rightend)
temp[k++] = arr[rightstart++];
for (k = start; k <=end; k++)
arr[k] = temp[k];
}
void mergesort(int *arr, int n)
{
int *temp = new int[n];
merge(arr, temp, 0, n - 1);
}
/*--------堆排序------时间:nlogn 空间:1 不稳定--------*/
void HeapMaxfixdown(int *arr, int i, int n)
{
int j = 2 * i + 1, temp = arr[i];
while (j < n)
{
if (j+1< n && arr[j] < arr[j + 1]) j++;
if (temp > arr[j]) break;
else
{
arr[i] = arr[j];
i = j;
j = 2 * i + 1;
}
}
arr[i] = temp;
}
void Heapsort(int *arr, int n)
{
for (int i =(n/2)-1; i >=0; i--)
{
HeapMaxfixdown(arr, i, n);
}
for (int i = n - 1; i >= 1; i--)
{
swap_elem(arr[0], arr[i]);
HeapMaxfixdown(arr, 0, i);
}
}
int main()
{
int arr[] = { 9, 3, 2, 5, 6, 1, 4, 7, 8,11,34,1,3,24,2,312,5,234};
int n = (sizeof(arr) / sizeof(int));
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
Heapsort(arr, n);
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
system("pause");
}