直接插入排序,冒泡排序,快速排序,选择排序,归并排序,堆排序
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<ctime>
#include<stdlib.h>
using namespace std;
// 插入排序
void InsertSort(int a[], int n)
{
int temp;
for(int i = 0; i < n; i++)
{
temp = a[i];
int j = i-1;
while(j && temp < a[j])
{
a[j+1] = a[j];
j --;
}
a[j+1] = temp;
}
}
// 冒泡排序
void BubbleSort(int a[], int n)
{
for(int i = n-1; i >= 0; i--)
for(int j = 1; j <= i; j++)
if(a[j-1] > a[j])
{
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
// 快速排序
void QuickSort(int a[], int l, int r)
{
int i = l, j = r;
if(l < r)
{
int temp = a[l];
while(i < j)
{
while(j > i && a[j] >= temp)
j --;
if(i < j)
{
a[i] = a[j];
i ++;
}
while(i < j && a[i] <= temp)
i++;
if(i < j)
{
a[j] = a[i];
j --;
}
}
a[i] = temp;
QuickSort(a, l, i-1);
QuickSort(a, i+1, r);
}
}
// 选择排序
void SelectSort(int a[], int n)
{
for(int i = 0; i < n; i++)
{
int k = i;
for(int j = i+1; j < n; j++)
{
if(a[k] > a[j])
k = j;
}
int temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
// 归并排序
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first;
int j = mid + 1;
int n = mid;
int m = last;
int k = 0;
while(i <= n && j <= m)
{
if(a[i] < a[j])
temp[k ++] = a[i ++];
else
temp[k ++] = a[j ++];
}
while(i <= n)
temp[k ++] = a[i ++];
while(j <= m)
temp[k ++] = a[j ++];
for(int i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if(first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp);
mergesort(a, mid + 1, last, temp);
mergearray(a, first, mid, last, temp);
}
}
// 堆排序 序号从1开始
void Sift(int a[], int l, int r)
{
int i = l, j = 2*i;
int temp = a[i];
while(j <= r)
{
if(j < r && a[j] < a[j+1])
j++;
if(temp < a[j]) // 父节点小于子节点, 则交换值,并指向子节点
{
a[i] = a[j];
i = j;
j = 2*i;
}
else
break;
}
a[i] = temp; // 该节点最终的位置
}
void HeapSort(int a[], int n)
{
int temp;
for(int i = n/2; i >= 1; i--) // 初始化堆
Sift(a, i, n);
for(int i = n; i >= 2; i--)
{
temp = a[1]; // 最右节点,交换根节点(根节点为最值)
a[1] = a[i];
a[i] = temp;
Sift(a, 1, i-1); // 减少一个
}
}
int main()
{
int a[5], b[5];
for(int i = 1; i <= 4; i++)
b[i] = rand()%10;
HeapSort(b, 4);
cout << "堆排序 : " << endl;
for(int i = 1; i <= 4; i++)
printf("%d%c", b[i], i==4?'\n':' ');
cout << "快速排序 :"<< endl;
QuickSort(a, 0, 4);
for(int i = 0; i < 5; i++)
printf("%d%c", a[i], i==4?'\n':' ');
for(int i = 0; i < 5; i++)
a[i] = rand()%10;
cout << "直接插入排序 :"<< endl;
QuickSort(a, 0, 4);
for(int i = 0; i < 5; i++)
printf("%d%c", a[i], i==4?'\n':' ');
for(int i = 0; i < 5; i++)
a[i] = rand()%10;
cout << "冒泡排序 :"<< endl;
QuickSort(a, 0, 4);
for(int i = 0; i < 5; i++)
printf("%d%c", a[i], i==4?'\n':' ');
for(int i = 0; i < 5; i++)
a[i] = rand()%10;
cout << "选择排序排序 :"<< endl;
QuickSort(a, 0, 4);
for(int i = 0; i < 5; i++)
printf("%d%c", a[i], i==4?'\n':' ');
for(int i = 0; i < 5; i++)
a[i] = rand()%10;
cout << "归并排序 :"<< endl;
QuickSort(a, 0, 4);
for(int i = 0; i < 5; i++)
printf("%d%c", a[i], i==4?'\n':' ');
return 0;
}