排序时间快慢比较:
快速>合并>希尔>堆>插入>选择>冒泡
1. 冒泡排序
//冒泡排序
void BubbleSort(int arr[], int length) {
for (int i = 0; i < length-1; i++)
{
for (int j = 0; j<length-i-1; j++)
{
if (arr[j] > arr[j+1]);
{
Swap(&arr[j], &arr[j+1]);
}
}
}
}
2. 选择排序
//选择排序
void SelectSort(int arr[], int length) {
for (int i = 0; i < length; i++) {
int min = i;
for (int j = i + 1; j < length; j++) {
if (arr[j] < arr[min])
min = j;
}
if (min != i)
Swap(&arr[min], &arr[i]);
}
}
3. 插入排序
//插入排序
void InsertSort(int arr[], int length) {
int j;
for (int i = 1; i < length; i++) {
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
for (j = i - 1; j >= 0 && temp < arr[j]; j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
//插入逆序
void InvInsertSort(int arr[], int length) {
int j;
for (int i = 1; i < length; i++)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
for (j = i - 1; j >= 0 && temp > arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
4. 希尔排序
//希尔排序
void ShellSort(int arr[], int length) {
int incerasement = length;
int i, j,k;
do {
//确定分组增量
incerasement = incerasement / 3 + 1;
for ( i = 0; i < incerasement; i++) {
for (j = i + incerasement; j < length; j += incerasement) {
if (arr[j] < arr[j - incerasement])
{
int temp = arr[j];
for (k = j - incerasement; k >= 0 && temp < arr[k]; k -= incerasement)
{
arr[k + incerasement] = arr[k];
}
arr[k+incerasement]=temp;
}
}
}
} while (incerasement>1);
}
//逆排序
void InvShellSort(int arr[], int length) {
int increasement = length;
int i,j, k;
do {
increasement = increasement / 3 + 1;
for (i = 0; i < increasement; i++) {
for (j = i + increasement; j < length; j += increasement) {
if (arr[j] > arr[j - increasement])
{
int temp = arr[j];
for (k = j - increasement; k >= 0 && temp > arr[k]; k -= increasement)
{
arr[k + increasement] = arr[k];
}
arr[k + increasement] = temp;
}
}
}
} while (increasement>1);
}
5. 快速排序
//快速排序
void QuickSort(int arr[], int start,int end) {
int i = start;
int j = end ;
int temp = arr[i];
if (i < j) {
//从右向左找比基准数小的
while (i < j) {
while (i < j && arr[j] >= temp) {
j--;
}
//填坑
if (i < j) {
arr[i] = arr[j];
i++;
}
//从左向右找比基准大的数
while (i < j && arr[i] < temp) {
i++;
}
//填坑
if (i < j) {
arr[j] = arr[i];
j--;
}
}
//把基准数放到i位置
arr[i] = temp;
//左半部分
QuickSort(arr,start,i-1 );
//右半部分
QuickSort(arr, i + 1, end);
}
}
6. 归并排序
//合并算法
void Merge(int arr[], int start, int end, int mid, int* temp) {
int i_start = start;
int i_end = mid;
int j_start = mid + 1;
int j_end = end;
//表示辅助空间元素
int length = 0;
while (i_start < i_end && j_start <= j_end) {
if (arr[i_start] < arr[j_start]) {
temp[length] = arr[i_start];
length++;
i_start++;
}
else {
temp[length] = arr[j_start];
j_start++;
length++;
}
}
//i这个序列
while (i_start <= i_end) {
temp[length] = arr[i_start];
i_start++;
length++;
}
//j这个序列
while (j_start <= j_end) {
temp[length] = arr[j_start];
j_start++;
length++;
}
//辅助空间覆盖原空间
for (int i= 0; i< length;i++)
{
arr[start + i] = temp[i];
}
}
//归并排序
void MergeSort(int arr[], int start, int end,int * temp) {
if (start >= end)
{
return;
}
int mid = (start + end) / 2;
//分组
//左半边
MergeSort(arr, start, mid, temp);
//右半边
MergeSort(arr, mid + 1, end, temp);
Merge(arr, start, end, mid, temp);
}
7. 堆排序
/*
@param arr 待调整的数组
@param index 待调整的节点下标
@param len 数组的长度
*/
void HeapAdjust(int arr[], int index, int length) {
//先保存当前节点下标
int max = index;
//保存左右孩子的数组下标
int lchild = index * 2 + 1;
int rchild = index * 2 + 2;
if (lchild<length && arr[lchild]> arr[max]) {
max = lchild;
}
if (rchild<length && arr[rchild]>arr[max]) {
max = rchild;
}
if (max != index)
{
Swap(&arr[max],&arr[index]);
HeapAdjust(arr, max, length);
}
}
//堆排序
void HeapSort(int arr[], int length) {
//初始化
for (int i = length / 2 - 1; i >= 0; i--) {
HeapAdjust(arr, i, length);
}
//交换堆顶元素和最后一个元素
for (int i = length - 1; i >= 0; i--)
{
Swap(&arr[0], &arr[i]);
HeapAdjust(arr, 0, i);
}
}
完全代码
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<time.h>
#include<sys/timeb.h>
using namespace std;
#define MAX 200000
long getsystime() {
struct timeb tb;
ftime(&tb);
return tb.time * 1000 + tb.millitm;
}
void Swap(int* a, int* b)
{
int p;
p = *a;
*a = *b;
*b = p;
}
void PrintArray(int arr[],int length) {
for (int i = 0; i < length; i++)
{
std::cout << arr[i] << ", ";
}
}
//冒泡排序
void BubbleSort(int arr[], int length) {
for (int i = 0; i < length-1; i++)
{
for (int j = 0; j<length-i-1; j++)
{
if (arr[j] > arr[j+1]);
{
Swap(&arr[j], &arr[j+1]);
}
}
}
}
//选择排序
void SelectSort(int arr[], int length) {
for (int i = 0; i < length; i++) {
int min = i;
for (int j = i + 1; j < length; j++) {
if (arr[j] < arr[min])
min = j;
}
if (min != i)
Swap(&arr[min], &arr[i]);
}
}
//插入排序
void InsertSort(int arr[], int length) {
int j;
for (int i = 1; i < length; i++) {
if (arr[i] < arr[i - 1])
{
int temp = arr[i];
for (j = i - 1; j >= 0 && temp < arr[j]; j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
//插入逆序
void InvInsertSort(int arr[], int length) {
int j;
for (int i = 1; i < length; i++)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
for (j = i - 1; j >= 0 && temp > arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
//希尔排序
void ShellSort(int arr[], int length) {
int incerasement = length;
int i, j,k;
do {
//确定分组增量
incerasement = incerasement / 3 + 1;
for ( i = 0; i < incerasement; i++) {
for (j = i + incerasement; j < length; j += incerasement) {
if (arr[j] < arr[j - incerasement])
{
int temp = arr[j];
for (k = j - incerasement; k >= 0 && temp < arr[k]; k -= incerasement)
{
arr[k + incerasement] = arr[k];
}
arr[k+incerasement]=temp;
}
}
}
} while (incerasement>1);
}
//逆排序
void InvShellSort(int arr[], int length) {
int increasement = length;
int i,j, k;
do {
increasement = increasement / 3 + 1;
for (i = 0; i < increasement; i++) {
for (j = i + increasement; j < length; j += increasement) {
if (arr[j] > arr[j - increasement])
{
int temp = arr[j];
for (k = j - increasement; k >= 0 && temp > arr[k]; k -= increasement)
{
arr[k + increasement] = arr[k];
}
arr[k + increasement] = temp;
}
}
}
} while (increasement>1);
}
//快速排序
void QuickSort(int arr[], int start,int end) {
int i = start;
int j = end ;
int temp = arr[i];
if (i < j) {
//从右向左找比基准数小的
while (i < j) {
while (i < j && arr[j] >= temp) {
j--;
}
//填坑
if (i < j) {
arr[i] = arr[j];
i++;
}
//从左向右找比基准大的数
while (i < j && arr[i] < temp) {
i++;
}
//填坑
if (i < j) {
arr[j] = arr[i];
j--;
}
}
//把基准数放到i位置
arr[i] = temp;
//左半部分
QuickSort(arr,start,i-1 );
//右半部分
QuickSort(arr, i + 1, end);
}
}
//合并算法
void Merge(int arr[], int start, int end, int mid, int* temp) {
int i_start = start;
int i_end = mid;
int j_start = mid + 1;
int j_end = end;
//表示辅助空间元素
int length = 0;
while (i_start < i_end && j_start <= j_end) {
if (arr[i_start] < arr[j_start]) {
temp[length] = arr[i_start];
length++;
i_start++;
}
else {
temp[length] = arr[j_start];
j_start++;
length++;
}
}
//i这个序列
while (i_start <= i_end) {
temp[length] = arr[i_start];
i_start++;
length++;
}
//j这个序列
while (j_start <= j_end) {
temp[length] = arr[j_start];
j_start++;
length++;
}
//辅助空间覆盖原空间
for (int i= 0; i< length;i++)
{
arr[start + i] = temp[i];
}
}
//归并排序
void MergeSort(int arr[], int start, int end,int * temp) {
if (start >= end)
{
return;
}
int mid = (start + end) / 2;
//分组
//左半边
MergeSort(arr, start, mid, temp);
//右半边
MergeSort(arr, mid + 1, end, temp);
Merge(arr, start, end, mid, temp);
}
/*
@param arr 待调整的数组
@param index 待调整的节点下标
@param len 数组的长度
*/
void HeapAdjust(int arr[], int index, int length) {
//先保存当前节点下标
int max = index;
//保存左右孩子的数组下标
int lchild = index * 2 + 1;
int rchild = index * 2 + 2;
if (lchild<length && arr[lchild]> arr[max]) {
max = lchild;
}
if (rchild<length && arr[rchild]>arr[max]) {
max = rchild;
}
if (max != index)
{
Swap(&arr[max],&arr[index]);
HeapAdjust(arr, max, length);
}
}
//堆排序
void HeapSort(int arr[], int length) {
//初始化
for (int i = length / 2 - 1; i >= 0; i--) {
HeapAdjust(arr, i, length);
}
//交换堆顶元素和最后一个元素
for (int i = length - 1; i >= 0; i--)
{
Swap(&arr[0], &arr[i]);
HeapAdjust(arr, 0, i);
}
}
int main() {
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX;i++)
{
arr[i] = rand() % MAX;
}
//PrintArray(arr, MAX);
std::cout << std::endl;
long t_start = getsystime();
//BubbleSort(arr, MAX);//200000组无限长
//SelectSort(arr, MAX);//200000组40430ms
//InsertSort(arr, MAX);//200000组20917ms
//InvInsertSort(arr, MAX);
long t_end0 = getsystime();
//ShellSort(arr, MAX);//200000组40ms
//InvShellSort(arr, MAX);
//QuickSort(arr, 0, MAX - 1);//200000组26ms
int* temp = (int*)malloc(sizeof(int) * MAX);
//MergeSort(arr, 0, MAX - 1,temp);//200000组36ms
//free(temp);
HeapSort(arr, MAX);//200000组154ms
long t_end1 = getsystime();
//PrintArray(arr, MAX);
std::cout << std::endl;
std::cout << "time0= " << t_end0 - t_start << std::endl;
std::cout << "time1= " << t_end1 - t_end0 << std::endl;
//system("pause");
}