目录
前言
本文章是笔者前些时间作为考试复习使用,现分享给大家。
均为经典排序算法,其实现策略不一,且我能力有限,短时间内赶出来的代码多少存在一些小问题,还请见谅。
1 插入排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
void InsertSort(int *arr, int len)
{
int i, j;
int temp;
for (i = 0; i < len; i++) // 执行len次
{
temp = arr[i]; // 摸下一张牌
for (j = i; j > 0 && arr[j - 1] > temp; j--) // 往前找合适的位置
arr[j] = arr[j - 1]; // 移出空位
arr[j] = temp; // 新牌落位
}
}
int main()
{
int i;
int arr[] = {70, 25, 23, 55, 31, 20, 22, 13, 62, 81, 50, 74, 65, 84, 80, 66, 64, 42, 12, 40};
InsertSort(arr, 20);
for (i = 0; i < 20; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
2 冒泡排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
void BubbleSort(int *arr, int len)
{
int i, j;
int temp;
int flag;
for (i = 0; i < len; i++)
{
flag = 0;
for (j = 0; j < len - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1;
}
}
if (!flag)
break;
}
}
int main()
{
int i;
int arr[] = {70, 25, 23, 55, 31, 20, 22, 13, 62, 81, 50, 74, 65, 84, 80, 66, 64, 42, 12, 40};
BubbleSort(arr, 20);
for (i = 0; i < 20; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
3 选择排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
void SelectSort(int *arr, int n)
{
int i, j;
int min;
int temp;
for (i = 0; i < n; i++) // 执行n次
{
// 从当前元素往后找出最小的
min = i;
for (j = i + 1; j < n; j++)
{
if (arr[j] < arr[min])
min = j;
}
// 将最小的与当前交换
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
int main()
{
int i;
int arr[] = {70, 25, 23, 55, 31, 20, 22, 13, 62, 81, 50, 74, 65, 84, 80, 66, 64, 42, 12, 40};
SelectSort(arr, 20);
for (i = 0; i < 20; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
4 希尔排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
void ShellSort(int *arr, int len)
{
int i, j;
int d; // gap
int temp;
for (d = len / 2; d > 0; d /= 2) // 希尔增量序列
{
for (i = d; i < len; i++) // 插入排序
{
temp = arr[i];
for (j = i; j >= d && arr[j - d] > temp; j -= d)
arr[j] = arr[j - d];
arr[j] = temp;
}
}
}
int main()
{
int i;
int arr[] = {70, 25, 23, 55, 31, 20, 22, 13, 62, 81, 50, 74, 65, 84, 80, 66, 64, 42, 12, 40};
ShellSort(arr, 20);
for (i = 0; i < 20; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
5 快速排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void QuickSort(int *arr, int low, int high);
int QuickSort_Partition(int *arr, int low, int high);
void QuickSort_RandomPivot(int *arr, int low, int high);
int main()
{
int i;
int arr[] = {70, 25, 23, 55, 31, 20, 22, 13, 62, 81, 50, 74, 65, 84, 80, 66, 64, 42, 12, 40};
QuickSort(arr, 0, 19);
for (i = 0; i < 20; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
void QuickSort(int *arr, int low, int high)
{
if (low < high)
{
int pivot = QuickSort_Partition(arr, low, high);
QuickSort(arr, low, pivot - 1);
QuickSort(arr, pivot + 1, high);
}
}
int QuickSort_Partition(int *arr, int low, int high)
{
int i, j; // i作为分水岭,比主元小的在i左侧,比主元大的在右侧,i+1为第一个比主元大的
int temp;
QuickSort_RandomPivot(arr, low, high); // 随机选取主元
int pivot = high; // 选取主元
i = low - 1; // 初始化i为low-1,j为low
for (j = low; j < high; j++) // 遍历所有元素
{
if (arr[j] <= arr[pivot]) // 当前元素比主元小,和i+1交换下
{
temp = arr[j];
arr[j] = arr[i + 1];
arr[i + 1] = temp;
i++; // i右移
}
}
temp = arr[pivot]; // 把主元放在中间做分界线
arr[pivot] = arr[i + 1];
arr[i + 1] = temp;
return i + 1;
}
void QuickSort_RandomPivot(int *arr, int low, int high)
{
srand((unsigned)time(NULL));
int num = rand();
int pivot = low + num % (high - low + 1);
int temp;
temp = arr[high];
arr[high] = arr[pivot];
arr[pivot] = temp;
}
6 归并排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
void MergeSort(int *arr, int low, int high);
void Merge(int *arr, int low, int mid, int high);
int main()
{
int i;
int arr[] = {70, 25, 23, 55, 31, 20, 22, 13, 62, 81, 50, 74, 65, 84, 80, 66, 64, 42, 12, 40};
MergeSort(arr, 0, 19);
for (i = 0; i < 20; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
void MergeSort(int *arr, int low, int high)
{
if (low >= high)
return;
int mid = (low + high) / 2;
MergeSort(arr, low, mid);
MergeSort(arr, mid + 1, high);
Merge(arr, low, mid, high);
}
void Merge(int *arr, int low, int mid, int high)
{
int i, j, k;
int *assist = (int *)malloc(sizeof(int) * (high + 1)); // 辅助数组,将两部分copy过来
for (k = low; k <= high; k++)
assist[k] = arr[k];
k = low;
i = low;
j = mid + 1;
while (i <= mid && j <= high)
{
if (assist[i] <= assist[j])
arr[k] = assist[i++];
else
arr[k] = assist[j++];
k++;
}
while (i <= mid)
arr[k++] = assist[i++];
while (j <= high)
arr[k++] = assist[j++];
}
7 堆排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
void HeapSort_Max(int *arr, int n);
void Heap_Max_Adjust(int *arr, int n, int index);
int main()
{
int i;
int arr[] = {70, 25, 23, 55, 31, 20, 22, 13, 62, 81, 50, 74, 65, 84, 80, 66, 64, 42, 12, 40};
HeapSort_Max(arr, 20);
for (i = 0; i < 20; i++)
printf("%d ", arr[i]);
system("pause");
return 0;
}
void HeapSort_Max(int *arr, int n)
{
int i;
int temp;
// 建堆
for (i = n / 2 - 1; i >= 0; i--)
Heap_Max_Adjust(arr, n, i);
// 排序
for (i = n - 1; i > 0; i--)
{
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
Heap_Max_Adjust(arr, i, 0);
}
}
void Heap_Max_Adjust(int *arr, int n, int index)
{
int max = index; // 需调整结点与其孩子中最大的那个数
int lchild, rchild;
lchild = 2 * index + 1;
rchild = 2 * index + 2;
if (lchild < n && arr[max] < arr[lchild])
max = lchild;
if (rchild < n && arr[max] < arr[rchild])
max = rchild;
if (max != index) // 需调整堆
{
int temp;
temp = arr[max];
arr[max] = arr[index];
arr[index] = temp;
Heap_Max_Adjust(arr, n, max); // 可以非递归
}
}