代码实现:
//排序算法
#include<iostream>
using namespace std;
int a[10] = { 10,4,9,8,2,1,3,6,7,5 };
int sign = 0;
int sign2 = 0;
void init() {
a[0] = 10;
a[1] = 4;
a[2] = 9;
a[3] = 8;
a[4] = 2;
a[5] = 1;
a[6] = 3;
a[7] = 6;
a[8] = 7;
a[9] = 5;
}
void Swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void pri(int* a, int size)
{
for (int i = 0; i < 10; i++)cout << a[i] << " ";
}
//冒泡排序
void maopao(int* a, int size) {
cout << "冒泡排序:" << endl;
cout << "每次将最大的推往当前最后一项" << endl;
for (int i = 0; i < size - 1; i++)//趟数
{
for (int j = 0; j < size - i - 1; j++)//比较次数
{
if (a[j] > a[j + 1])
{
Swap(a + j, a + j + 1);
}
pri(a, size);
cout << endl;
}
}
}
//快速排序
void kuaisu(int* a, int low,int high) {
if (sign == 0) {
cout << "快速排序:" << endl;
cout << "从待排序的数据中随机取一个数据作为key,将比其大的和小的数划分开来,重复以上步骤" << endl;
sign = 1;
}
int key;
int i = low, j = high;
if (low < high) {
key = a[low];
while (i < j) {
while (j > i && a[j] >= key) j--;
if (i < j) {
a[i] = a[j];
pri(a, 10);
cout << endl;
i++;
}
while (j > i && a[i] < key)i++;
if (i < j) {
a[j] = a[i];
pri(a, 10);
cout << endl;
j--;
}
}
a[i] = key;
kuaisu(a, low, i - 1);
kuaisu(a, i + 1, high);
}
}
//直接插入排序
void zhijiecharu(int* a,int size) {
cout << "直接插入法:" << endl;
cout << "从前面第二个开始,前向排序,排好后移,这样保证每次前面的都是排序好的,关于为什么叫直接插入,可能是区别于直接的交换吧" << endl;
for (int i = 1; i < size; i++) {
for (int j = i; j >0; j--) {
if (a[j] < a[j - 1]) {
Swap(a + j, a + j - 1);
pri(a, 10);
cout << endl;
}
else {
break;
}
}
}
}
//希尔排序
void shell(int* a, int size) {
cout << "希尔排序:" << endl;
cout << "设置一个增量,起初为数组大小,每次除2,以增量为间隔并进行分组,组内直接排序" << endl;
int d = size / 2;
while (1) {
for (int i = 0; i < d; i++) {
for (int j = i; j + d < size; j += d) {
for (int k = j + d; k - d >= 0; k -= d) {
if (a[k] < a[k - d]) {
Swap(a + k, a + k - d);
pri(a, 10);
cout << endl;
}
else {
break;
}
}
}
}
if (d == 1) {
break;
}
d = d / 2;
}
}
//直接选择排序
void zhijiexuanze(int* a, int size) {
cout << "直接选择排序:" << endl;
cout << "每次挑选出一个最小的放在前面,这样前面都是排好的,类似于直接插入的形式" << endl;
int min;
for (int i = 0; i < size - 1; i++) {
min = i;
for (int j = i + 1; j < size; j++) {
if (a[j] < a[min]) {
min = j;
}
}
if (min != i) {
Swap(a + i, a + min);
pri(a, 10);
cout << endl;
}
}
}
//归并排序
void guibing_hebing(int* a, int left, int mid, int right) {
int* temp = (int*)malloc(sizeof(int) * (right - left + 1));
int i = left, j = mid + 1;
int k = 0;
while (i <= mid && j <= right) {
if (a[i] < a[j]) {
temp[k++] = a[i++];
}
else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= right) {
temp[k++] = a[j++];
}
for (i = 0; i < k; i++) {
a[left + i] = temp[i];
}
}
void guibing_chaifen(int* a, int left, int right) {
if (sign2 == 0) {
cout << "归并排序:" << endl;
cout << "先二分到单个元素,再两两组生成,两组合并时比较着间或插入" << endl;
sign2 = 1;
}
if (left < right) {
int mid = left + (right - left) / 2;
guibing_chaifen(a, left, mid);
guibing_chaifen(a, mid + 1, right);
guibing_hebing(a,left,mid,right);
pri(a, 10);
cout << endl;
}
}
int main() {
init();
maopao(a, 10);
init();
kuaisu(a, 0, 9);
init();
zhijiecharu(a, 10);
init();
shell(a, 10);
init();
zhijiexuanze(a, 10);
init();
guibing_chaifen(a, 0, 9);
}
缺少堆排序