通知设置 新通知
#2020学习打卡##C程序设计语言# C语言中static全局变量与普通的全局变量有什么区别?
回复zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2876 次浏览 • 2020-04-16 12:00
#2020学习打卡##C程序设计语言# C语言编译的时候,命令cc和gcc有啥区别?
回复zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2901 次浏览 • 2020-04-15 17:11
#2020学习打卡##C程序设计语言# 为什么C语言没有数组下标越界检测和报错?
回复zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2881 次浏览 • 2020-04-15 15:38
#2020学习打卡##C程序设计语言# 直接插入排序和改进版Shell排序解析
zkbhj 发表了文章 • 0 个评论 • 1826 次浏览 • 2020-04-14 17:54
直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。直接插入排序的时间复杂度为 O(n2)。
实例如下所示:
定义的数组 : {23,34,56,78,65,90,88,92,18,21}
过程如下所示:
【23】 34 56 78 65 90 88 92 18 21
第 1 次排序结果: 【23 34】 56 78 65 90 88 92 18 21
——用34插入到【23】序列中,34>23,故插入后的顺序是【23,34】
第 2 次排序结果: 【 23 34 56 】78 65 90 88 92 18 21
——用56插入到【23,34】序列中,56>34,故插入后的顺序是【23,34,56】
第 3 次排序结果: 【23 34 56 78】65 90 88 92 18 21
——用78插入到【23,34,56】序列中,78>56,故插入后的顺序是【23,34,56,78】
第 4 次排序结果: 【23 34 56 65 78 】90 88 92 18 21
——用65插入到【23,34,56,78】序列中,65<78,所以78后移一位,和56比较,65>56,故插入后的顺序是【23,34,56,65, 78】
第 5 次排序结果: 【23 34 56 65 78 90 】 88 92 18 21
——用90插入到【23,34,56,65, 78】序列中,78<90 ,故插入后的顺序是【23 34 56 65 78 90 】
第 6 次排序结果: 23 34 56 65 78 88 90 92 18 21
——用88插入到【23 34 56 65 78 90 】序列中,90>88 ,所以90后移一位,故插入后的顺序是【23 34 56 65 78 88 90】
第 7 次排序结果: 23 34 56 65 78 88 90 92 18 21
——用92插入到【23 34 56 65 78 90 】序列中,90<92 ,故插入后的顺序是【23 34 56 65 78 90 92 】
第 8 次排序结果: 18 23 34 56 65 78 88 90 92 21
——用18插入到【23 34 56 65 78 90 92 】序列中,18<92,所以92后移一位,和90比较,90>18,依次后移,直到第一位23,因为18<23, 故插入后的顺序是【18 23 34 56 65 78 88 90 92】
第 9 次排序结果: 18 21 23 34 56 65 78 88 90 92
——用21插入到【23 34 56 65 78 90 92 】序列中,21<92,故92后移一位,和90比较,90>21,依次后移,直到第一位18,因为18<21, 故插入后的顺序是【18 21 23 34 56 65 78 88 90 92】
C语言实现:#include <stdio.h>
//自定义的输出函数
void print(int a, int n ,int i){
printf("%d:",i);
for(int j=0; j<8; j++){
printf("%d",a[j]);
}
printf("\n");
}
//直接插入排序函数
void InsertSort(int a, int n)
{
for(int i= 1; i<n; i++){
if(a < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。
int j= i-1;
int x = a;
while(j>-1 && x < a[j]){ //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
a[j+1] = a[j];
j--;
}
a[j+1] = x; //插入到正确位置
}
print(a,n,i);//打印每次排序后的结果
}
}
int main(){
int a[8] = {3,1,7,5,2,4,9,6};
InsertSort(a,8);
return 0;
}
二、Shell排序:直接插入排序算法的一种高速而稳定的改进版本
希尔排序,也称递减增量排序算法,是一种插入排序算法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。Shell排序的执行时间依赖于增量序列。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量=1(<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
Shell排序算法的特点
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率[list][*]但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
[/*]
[/list]
时间复杂度:最坏情况下为O(n^2),平均时间复杂度为O(nlogn);
空间复杂度:归并排序需要一个大小为1的临时存储空间用以保存合并序列,所以空间复杂度为O(1)
算法稳定性:从上面图片中可以看出,数字5在排序后交换了位置,所以它是不稳定的算法。
例如:12、5、9、34、6、8、33、56、89、0、7、4、22、55、77
具体步骤:
void Shell(int *arr,int len,int gap)
{
for(int i = gap;i < len;i++)
{
int temp = arr;
int j = 0;
for(j = i-gap;j >= 0;j-=gap)
{
if(arr[j] > temp)
{
arr[j+gap] = arr[j];
}
else
{
break;
}
}
arr[j+gap] = temp;
}
}
void Shell_Sort(int *arr,int len)
{
int drr = {5,3,1}; //drr为分的组数,这里5,3,1不固定,但必须相互为素数,且最后数为1
int lend = sizeof(drr)/sizeof(drr[0]);
for(int i = 0;i < lend;i++)
{
Shell(arr,len,drr);
}
}
引用文章:
https://blog.csdn.net/FDk_LCL/java/article/details/90581904
https://www.cnblogs.com/guopengxia0719/p/10520561.html
https://www.cnblogs.com/BaoZiY/p/10931406.html
查看全部
直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。直接插入排序的时间复杂度为 O(n2)。
实例如下所示:
定义的数组 : {23,34,56,78,65,90,88,92,18,21}
过程如下所示:
【23】 34 56 78 65 90 88 92 18 21
第 1 次排序结果: 【23 34】 56 78 65 90 88 92 18 21
——用34插入到【23】序列中,34>23,故插入后的顺序是【23,34】
第 2 次排序结果: 【 23 34 56 】78 65 90 88 92 18 21
——用56插入到【23,34】序列中,56>34,故插入后的顺序是【23,34,56】
第 3 次排序结果: 【23 34 56 78】65 90 88 92 18 21
——用78插入到【23,34,56】序列中,78>56,故插入后的顺序是【23,34,56,78】
第 4 次排序结果: 【23 34 56 65 78 】90 88 92 18 21
——用65插入到【23,34,56,78】序列中,65<78,所以78后移一位,和56比较,65>56,故插入后的顺序是【23,34,56,65, 78】
第 5 次排序结果: 【23 34 56 65 78 90 】 88 92 18 21
——用90插入到【23,34,56,65, 78】序列中,78<90 ,故插入后的顺序是【23 34 56 65 78 90 】
第 6 次排序结果: 23 34 56 65 78 88 90 92 18 21
——用88插入到【23 34 56 65 78 90 】序列中,90>88 ,所以90后移一位,故插入后的顺序是【23 34 56 65 78 88 90】
第 7 次排序结果: 23 34 56 65 78 88 90 92 18 21
——用92插入到【23 34 56 65 78 90 】序列中,90<92 ,故插入后的顺序是【23 34 56 65 78 90 92 】
第 8 次排序结果: 18 23 34 56 65 78 88 90 92 21
——用18插入到【23 34 56 65 78 90 92 】序列中,18<92,所以92后移一位,和90比较,90>18,依次后移,直到第一位23,因为18<23, 故插入后的顺序是【18 23 34 56 65 78 88 90 92】
第 9 次排序结果: 18 21 23 34 56 65 78 88 90 92
——用21插入到【23 34 56 65 78 90 92 】序列中,21<92,故92后移一位,和90比较,90>21,依次后移,直到第一位18,因为18<21, 故插入后的顺序是【18 21 23 34 56 65 78 88 90 92】
C语言实现:
#include <stdio.h>
//自定义的输出函数
void print(int a, int n ,int i){
printf("%d:",i);
for(int j=0; j<8; j++){
printf("%d",a[j]);
}
printf("\n");
}
//直接插入排序函数
void InsertSort(int a, int n)
{
for(int i= 1; i<n; i++){
if(a < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。
int j= i-1;
int x = a;
while(j>-1 && x < a[j]){ //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
a[j+1] = a[j];
j--;
}
a[j+1] = x; //插入到正确位置
}
print(a,n,i);//打印每次排序后的结果
}
}
int main(){
int a[8] = {3,1,7,5,2,4,9,6};
InsertSort(a,8);
return 0;
}
二、Shell排序:直接插入排序算法的一种高速而稳定的改进版本
希尔排序,也称递减增量排序算法,是一种插入排序算法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。Shell排序的执行时间依赖于增量序列。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量=1(<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
Shell排序算法的特点
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率[list][*]但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
[/*]
[/list]
时间复杂度:最坏情况下为O(n^2),平均时间复杂度为O(nlogn);
空间复杂度:归并排序需要一个大小为1的临时存储空间用以保存合并序列,所以空间复杂度为O(1)
算法稳定性:从上面图片中可以看出,数字5在排序后交换了位置,所以它是不稳定的算法。
例如:12、5、9、34、6、8、33、56、89、0、7、4、22、55、77
具体步骤:
void Shell(int *arr,int len,int gap)
{
for(int i = gap;i < len;i++)
{
int temp = arr;
int j = 0;
for(j = i-gap;j >= 0;j-=gap)
{
if(arr[j] > temp)
{
arr[j+gap] = arr[j];
}
else
{
break;
}
}
arr[j+gap] = temp;
}
}
void Shell_Sort(int *arr,int len)
{
int drr = {5,3,1}; //drr为分的组数,这里5,3,1不固定,但必须相互为素数,且最后数为1
int lend = sizeof(drr)/sizeof(drr[0]);
for(int i = 0;i < lend;i++)
{
Shell(arr,len,drr);
}
}
引用文章:
https://blog.csdn.net/FDk_LCL/java/article/details/90581904
https://www.cnblogs.com/guopengxia0719/p/10520561.html
https://www.cnblogs.com/BaoZiY/p/10931406.html
#2020学习打卡##C程序设计语言# 为什么C教材和程序里有时候要使用八进制或者十六进制的数字形式呢?
回复zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 2941 次浏览 • 2020-04-12 23:56
#2020学习打卡##C程序设计语言# C语言中如何获取函数或程序段执行所花费的时间?
回复zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2864 次浏览 • 2020-04-12 15:42
#2020学习打卡##C程序设计语言# 各种字符编码都有什么区别和联系?
zkbhj 发表了文章 • 0 个评论 • 1810 次浏览 • 2020-04-09 12:02
一、EBCDIC
EBCDIC (Extended Binary Coded Decimal Interchange Code) 为国际商用机器公司(IBM)于1963年-64年间推出的字符编码表,根据早期打孔机式的二进化十进数(BCD, Binary Coded Decimal)排列而成。,是IBM为它的更大型的操作系统而开发的。
EBCDIC编码中,英文字母不是连续地排列,中间出现多次断续,为撰写程序的人带来了一些困难。
ASCII比EBCDIC后出现,ASCII的编码方式参照了EBCDIC,将英文连了起来,方便了程序员记忆。因此,就连IBM的个人计算机和工作站操作系统也不使用它们所有的EBCDIC编码。相反的,它们使用文本的工业标准编码,ASCII码。
转化程序允许不同的操作系统从一种编码到另一种编码的转化。
二、ASCII
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。
三、Unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
四、更多
目前的文字编码标准主要有 ASCII、GB2312、GBK、Unicode等。ASCII 编码是最简单的西文编码方案。GB2312、GBK、GB18030 是汉字字符编码方案的国家标准。ISO/IEC 10646 和 Unicode 都是全球字符编码的国际标准。 查看全部
一、EBCDIC
EBCDIC (Extended Binary Coded Decimal Interchange Code) 为国际商用机器公司(IBM)于1963年-64年间推出的字符编码表,根据早期打孔机式的二进化十进数(BCD, Binary Coded Decimal)排列而成。,是IBM为它的更大型的操作系统而开发的。
EBCDIC编码中,英文字母不是连续地排列,中间出现多次断续,为撰写程序的人带来了一些困难。
ASCII比EBCDIC后出现,ASCII的编码方式参照了EBCDIC,将英文连了起来,方便了程序员记忆。因此,就连IBM的个人计算机和工作站操作系统也不使用它们所有的EBCDIC编码。相反的,它们使用文本的工业标准编码,ASCII码。
转化程序允许不同的操作系统从一种编码到另一种编码的转化。
二、ASCII
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。
三、Unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
四、更多
目前的文字编码标准主要有 ASCII、GB2312、GBK、Unicode等。ASCII 编码是最简单的西文编码方案。GB2312、GBK、GB18030 是汉字字符编码方案的国家标准。ISO/IEC 10646 和 Unicode 都是全球字符编码的国际标准。










