题目
今天开始更新数据结构C语言版的十大排序算法,因为我只考常用的一些排序算法,所以会只更新我学的6个常用算法,分为算法思想,算法代码和执行结果三个部分展现。
更新第一篇:C语言实现归并排序
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692
一、算法思想
1.算法执行过程动图演示:
2.定义:
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
3.算法思想:
one:把长度为n的输入序列分成两个长度为n/2的子序列;
two:对这两个子序列分别采用归并排序;
three:将两个排序好的子序列合并成一个最终的排序序列。
4.我的总结:
归并排序就是把两个已经有序的序列合并成一个有序序列。
稳定性为:稳定
时间复杂度为:O(n log2^n)
(因为n个元素的趟数=log2^n,每趟的时间复杂度为O(n),那么整个算法的时间复杂度就是:O(n log2^n))
空间复杂度为:O(n)
5.学习笔记:
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
void merge(int a[], int low, int mid, int high)
{
int* b = (int*)malloc(high * sizeof(int));//定义辅助数组b用于暂时存放未排序数组
int i, j, k;
for (k = low; k <= high; k++)
b[k] = a[k];//将a中所有值复制到b
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++)
{
if (b[i] < a[j])a[k] = b[i++];
else a[k] = b[j++];//依次比较两部分的元素,将最小值放到a中
}
while (i <= mid)a[k++] = b[i++];
while (j <= high)a[k++] = b[j++];//因为需要归并的两部分数组都是有序的,因此当有一部分元素全放进a中后,另一部分的元素本身已有序就不用比较直接依次全部放入a即可
}
void mergesort(int a[], int low, int high)
{
if (low < high)//当low<high时,说明当前数组还没有完全有序,所以要进行排序
{
int mid = (low + high) / 2;//从中间划分为两个子表
mergesort(a, low, mid);//对左半部分递归地进行归并排序
mergesort(a, mid + 1, high);//对右半部分递归地进行归并排序
merge(a, low, mid, high);//归并算法-将左右两个有序子序列合并为一个
}
}
void main()
{
int a[] = { 4,5,6,7,8,9,1,2,3 };
int high = sizeof(a) / sizeof(int);//定义high的值为数组元素个数
mergesort(a, 0, high-1);//进行归并排序
for (int i = 0; i < high; i++)//将拍完序的数组进行输出
printf("%d ", a[i]);
}
三、执行结果
输入:
a[] = { 4,5,6,7,8,9,1,2,3 };
输出:
1 2 3 4 5 6 7 8 9