#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/***********************************************************************/
//直接插入_顺序查找法
void InsertSort(int* key, int num) {
int i, j;
for (i = 2; i < num+1; i++) {
if (key[i] < key[i - 1]) {
//先跟紧挨着待插入的比,依次往前试,直到试出
key[0] = key[i]; //把待插入/破坏顺序的关键字kk复制为监视哨
for (j = i - 1; key[j] > key[0]; j--) {
//从kk往前找,找到一个适合key[0]的位置
key[j + 1] = key[j];
}
key[j + 1] = key[0]; //把kk放入合适位置
}
}
//return key;
}/************************************************************************/
//折半插入_折半查找法
void BI_InsertSort(int* key, int num) {
int i, j, high, low, mid;
for (i = 2; i < num + 1; i++) {
if (key[i] < key[i - 1]) {
key[0] = key[i];
high = i - 1; low = 1;
while (low <= high) {
mid = (low + high) / 2;
if (key[0] < key[mid]) {
high = mid - 1;
}
else {
low = mid + 1;
}
} //折半查找到合适插入位置为high+1
for (j = i - 1; j >= high + 1; j--) {
//往后挪
key[j + 1] = key[j];
}
key[high + 1] = key[0];
}
}
}/*************************************************************************/
//冒泡排序
void BubbleSort(int* key, int num) {
int i, j, tmp;
for (i = 2; i < num+1; i++) {
for (j = 1; j <= num - i+1; j++) {
if (key[j+1] < key[j]) {
tmp = key[j];
key[j] = key[j+1];
key[j+1] = tmp;
}
}
}
}/**************************************************************************/
//快速排序找中间位置
int Partition(int* key, int low, int high) {
key[0] = key[low];
while (low < high) {
//从后面找小于参考值的数,放到前面
while (low < high&&key[high] >= key[0]) { high--; }
key[low] = key[high];
//从前找大于参考值的数,放到后面
while (low < high&&key[low] <= key[0]) { low++; }
key[high] = key[low];
//空位一直在前后前后的挪动
//直至high和low的位置重合,此位置就是中心点枢轴的位置
}
key[low] = key[0];
return low;
}
//快速排序
void QuickSort(int* key, int low, int high) {
int pivotLoc;
if (low < high) {
//用了递归,每次先找到枢轴位置,然后对被其分成的两个子表继续排序
pivotLoc = Partition(key, low, high);
QuickSort(key, low, pivotLoc - 1);
QuickSort(key, pivotLoc + 1, high);
}
}
/*************************************************************************/
//简单选择排序
void ChooseSort(int* key, int num) {
int i, j, tmp;
for (i = 1; i < num + 1; i++) {
for (j = i + 1; j < num + 1; j++) {
if (key[j] < key[i]) {
tmp = key[i];
key[i] = key[j];
key[j] = tmp;
}
}
}
}/************************************************************************/
//归并排序
//堆排序_筛选过程
void HeapAdjust(int* key, int s, int m) {
int j;
int rc = key[s];
for (j = 2 * s; j <= m; j *= 2) {
if (j < m && key[j] < key[j + 1]) { j++; }
if (rc >= key[j]) { break; }
key[s] = key[j];
s = j;
}
key[s] = rc;
}
//堆排序_总体排序
void HeapSort(int* key, int num) {
int i, tmp;
for (i = num / 2; i >= 1; i--) {
HeapAdjust(key, i, num);
}
for (i = num; i > 1; i--) {
tmp = key[1];
key[1] = key[i];
key[i] = tmp;
HeapAdjust(key, 1, i - 1);
}
}
//打印排序数组
void print(int* key, int num) {
int i = 0;
for (i = 1; i < num + 1; i++) {
if (i < num) {
printf("%d ", key[i]);
}
else {
printf("%d\n", key[i]);
}
}
}
int main() {
int i, num;
scanf("%d", &num);
int* key = (int*)malloc((num + 1) * sizeof(int));
key[0] = 0;
for (i = 1; i < num+1; i++) {
scanf("%d", key + i);
}
//InsertSort(key, num);
//BI_InsertSort(key, num);
//BubbleSort(key, num);
//QuickSort(key, 1, num);
//ChooseSort(key, num);
HeapSort(key, num);
print(key, num);
print(key, num);
print(key, num);
print(key, num);
print(key, num);
print(key, num);
return 0;
/*数据结构 排序算法
最新推荐文章于 2024-07-13 16:00:03 发布