注:该篇文章按照从小至大进行排序
1.选择排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define N 10
void SelectSort(int num[]) {
int i, j, temp, min, flag;
for (i = 0; i < N; i++) {
flag = i;
min = num[i];
for (j = i + 1; j < N; j++) {
if (num[j] < min) {
min = num[j];
flag = j;
}
}
temp = num[flag];
num[flag] = num[i];
num[i] = temp;
}
}
void print(int num[]) {
int i;
for (i = 0; i < N; i++) {
printf("%d ", num[i]);
}
printf("\n");
}
int main() {
int i, j, temp;
int num[N] = { 99,12,65,211,56,985,8,16,666,438 };
SelectSort(num);
print(num);
return 0;
}
2.冒泡排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define N 10
void print(int num[]) {
int i;
for (i = 0; i < N; i++) {
printf("%d ", num[i]);
}
printf("\n");
}
int main() {
int i, j, temp;
int num[N] = { 99,12,65,211,56,985,8,16,666,438 };
// 外层循环控制比较趟数
for (i = 0; i < N - 1; i++) {
// 内层循环控制这一趟的比较次数
for (j = 0; j < N - 1 - i; j++) {
if (num[j] > num[j + 1]) {
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
print(num);
return 0;
}
3.插入排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define N 10
void InsertSort(int num[]) {
int i, j, x; // x保存将要向前插入的值
for (i = 1; i < N; i++) {
// 若后一个的值小于前一个的值,则要进行插入
if (num[i] < num[i - 1]) {
j = i - 1;
x = num[i];
// 向后移动
while (j >= 0 && x < num[j]) {
num[j + 1] = num[j];
j--;
}
// 找到插入的位置,执行插入操作
num[j + 1] = x;
}
}
}
void print(int num[]) {
int i;
for (i = 0; i < N; i++) {
printf("%d ", num[i]);
}
printf("\n");
}
int main() {
int i, j, temp;
int num[N] = { 99,12,65,211,56,985,8,16,666,438 };
InsertSort(num);
print(num);
return 0;
}
4.快速排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define N 10
int huafen(int num[], int low, int high) {
int pivot = num[low]; // 确定基准值
while (low < high) {
while (low < high && num[high] >= pivot) high--;
num[low] = num[high];
while (low < high && num[low] <= pivot)low++;
num[high] = num[low];
}
num[low] = pivot;
return low;
}
void Qsort(int num[], int low, int high) {
if (low < high) {
int mids = huafen(num, low, high);
Qsort(num, low, mids - 1);
Qsort(num, mids + 1, high);
}
}
void print(int num[]) {
int i;
for (i = 0; i < N; i++) {
printf("%d ", num[i]);
}
printf("\n");
}
int main() {
int i, j, temp;
int num[N] = { 99,12,65,211,56,985,8,16,666,438 };
Qsort(num,0,N-1);
print(num);
return 0;
}
5.堆排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define N 7
void HeapAdjust(int a[], int k,int end) {
// 保存当前子树根节点
int temp, i;
temp = a[k];
// 从当前子树根节点的左孩子开始比较
for (i = 2 * k + 1; i <= end; i = 2 * i + 1) {
// 有右孩子并且左孩子比右孩子小,则让i指向右孩子
if (i < end && a[i] < a[i + 1]) {
i++;
}
// 若根>左 || 右
if (temp > a[i]) break;
// 若根<左 || 右
else {
a[k] = a[i];
k = i;
}
}
a[k] = temp;
}
void HeapSort(int a[], int len) {
// 下标为0建立大根堆
int i, flag;
for (i = len / 2 - 1; i >= 0; i--) {
HeapAdjust(a, i, len - 1);
}
// 将调整好的根和最后一个叶子结点交换
for (i = 0; i < len - 1; i++) {
flag = a[0];
a[0] = a[len - 1 - i];
a[len - 1 - i] = flag;
HeapAdjust(a, 0, len - 1 - i - 1);
}
}
void print(int a[], int len) {
int i;
for (i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
printf("%d\n", a[len / 2]);
}
int main() {
int arr[N] = { -1,100,2,100,100,4,100 };
HeapSort(arr, N);
print(arr, N);
return 0;
}