C C++笔试面试题目汇总3——各种排序算法
编程面试题目

编程面试题目在进行编程面试时,面试官会提出一系列的问题和任务,以评估应聘者的编程能力和解决问题的能力。
本文将介绍几个常见的编程面试题目,并提供相应的解答和示例代码。
1. 反转字符串题目描述:编写一个函数,将输入的字符串进行反转输出。
解答:```pythondef reverse_string(input_string):return input_string[::-1]input_str = "Hello World!"print(reverse_string(input_str))```2. 查找数组中的最大值和最小值题目描述:给定一个整数数组,编写一个函数找到数组中的最大值和最小值。
解答:```pythondef find_max_min(numbers):max_value = max(numbers)min_value = min(numbers)return max_value, min_valuenums = [5, -1, 9, 3, 0, 2]max_num, min_num = find_max_min(nums)print("Max value: ", max_num)print("Min value: ", min_num)```3. 判断两个字符串是否为异构词题目描述:给定两个字符串,判断它们是否为异构词(即包含相同的字符,但字符的顺序可以不同)。
解答:```pythondef is_anagram(str1, str2):if len(str1) != len(str2):return Falsecount = [0] * 26 # 假设只包含小写字母for i in range(len(str1)):count[ord(str1[i]) - ord('a')] += 1count[ord(str2[i]) - ord('a')] -= 1for c in count:if c != 0:return Falsereturn Truestring1 = "listen"string2 = "silent"print(is_anagram(string1, string2))```4. 链表反转题目描述:给定一个单向链表,编写一个函数将其反转。
C语言--常见排序算法

49
2 j 49
08
0
25* 3 49 25
16 4
21
5
08
25
25*
16
21
i k 49
j 25* 25
08
25
25*
16
21
算法实例:
1.1.5 选择排序
49 2
08 0
25 1 i
25* 3
16 4 k
21 5 j 21 16
k 指示当前序列中最小者
算法实现:
08 5 temp
16 21 25 25* 49 08 0 1 2 3 4 5
算法实现:
1.1.3 直接插入排序
void InsertSort (int r[ ], int n ) { // 假设关键字为整型,放在向量r[]中 int i, j, temp; for (i = 1;i< n;i++ ) { temp = r[i]; for(j = i;j>0;j- -) {//从后向前顺序比较,并依次后移 if ( temp < r[j-1] ) r[j] = r[j-1]; else break; } r[j] = temp; } }
输入n 个数给a[1] 到 a[n]
for j=1 to n-1
for i=1 to n-j
真 a[i]>a[i+1]
a[i]a[i+1]
输出a[1] 到 a[n]
main() { int a[11],i,j,t; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); printf("\n"); 假 for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }
c语言面试中常问的算法题目

c语言面试中常问的算法题目
在 C 语言面试中,常常会涉及一些算法题目,以下是一些常见
的算法题目及其解答:
1. 反转字符串:
题目,给定一个字符串,将其反转。
解答,可以使用两个指针,一个指向字符串的起始位置,另
一个指向字符串的末尾位置,然后交换两个指针所指向的字符,然
后两个指针向中间移动,重复这个过程直到两个指针相遇。
2. 判断字符串是否为回文串:
题目,给定一个字符串,判断它是否是回文串(正读和反读
都相同)。
解答,可以使用两个指针,一个指向字符串的起始位置,另
一个指向字符串的末尾位置,然后逐个比较两个指针所指向的字符,如果不相等则不是回文串。
3. 查找数组中的最大值和最小值:
题目,给定一个整数数组,找出数组中的最大值和最小值。
解答,可以使用两个变量分别保存当前的最大值和最小值,然后遍历数组,逐个比较并更新最大值和最小值。
4. 实现快速排序算法:
题目,给定一个整数数组,使用快速排序算法对数组进行排序。
解答,快速排序算法的基本思想是选择一个基准元素,将数组分为两部分,一部分小于基准元素,一部分大于基准元素,然后递归地对两部分进行排序。
5. 判断一个数是否为素数:
题目,给定一个整数,判断它是否为素数(只能被 1 和自身整除)。
解答,可以使用循环遍历从 2 到该数的平方根,逐个判断是否能整除该数,如果能整除则不是素数。
以上是一些常见的在 C 语言面试中经常被问到的算法题目及其解答。
当然,还有很多其他的算法题目,希望这些题目能帮助您更好地准备面试。
c语言排序题

c语言排序题题目:编写一个C语言程序,该程序接收一个整数数组和数组的大小作为输入,并使用冒泡排序算法对数组进行升序排序。
程序应该输出排序后的数组。
示例代码:c#include <stdio.h>// 交换两个整数的函数void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}// 冒泡排序函数void bubbleSort(int arr[], int n) {int i, j;for (i = 0; i < n-1; i++) {for (j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {swap(&arr[j], &arr[j+1]);}}}}// 打印数组的函数void printArray(int arr[], int size) {int i;for (i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}// 主函数int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90}; // 示例数组int n = sizeof(arr)/sizeof(arr[0]); // 计算数组大小bubbleSort(arr, n); // 对数组进行排序printf("Sorted array: \n");printArray(arr, n); // 打印排序后的数组return 0;}在这个示例中,我们定义了三个函数:swap 用于交换两个整数的值,bubbleSort 用于实现冒泡排序算法,printArray 用于打印数组的内容。
main 函数是程序的入口点,它定义了一个待排序的整数数组,并调用bubbleSort 函数对其进行排序,最后调用printArray 函数打印出排序后的结果。
c语言面试题目100及最佳答案精选全文

精选全文完整版(可编辑修改)c语言面试题目及最佳答案1、描述⼀下gcc的编译过程?gcc编译过程分为4个阶段:预处理、编译、汇编、链接。
预处理:头⼀件包含、宏替换、条件编译、删除注释编译:主要进⼀词法、语法、语义分析等,检查⼀误后将预处理好的⼀件编译成汇编⼀件。
汇编:将汇编⼀件转换成⼀进制⼀标⼀件链接:将项⼀中的各个⼀进制⼀件+所需的库+启动代码链接成可执⼀⼀件2、内存的最⼀存储单位以及内存的最⼀计量单位分别是?内存的最⼀存储单位为⼀进制位,内存的最⼀计量单位字节3、#include<> 与#include ""的区别?include<>到系统指定⼀录寻找头⼀件,#include ""先到项⼀所在⼀录寻找头⼀件,如果没有找再到系统指定的⼀录下寻找4、描述⼀下变量的命名规则变量名有字⼀、数值、下划线组成,但不能以数值开头5、变量的声明与定义有啥区别?声明变量不需要建⼀存储空间,变量的定义需要建⼀存储空间6、谈谈c语⼀中有符号和⼀符号的区别?有符号:数据的最⼀位为符号位,0表示正数,1表示负数⼀符号:数据的最⼀位不是符号位,⼀是数据的⼀部分7、谈谈计算机中补码的意义统⼀了零的编码将符号位与其他位统⼀处理将减法运算转换成加法运算8、谈谈数组的特点同⼀个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的9、数组的分类数组的分类主要是:静态数组、动态数组两类。
静态数组:类似int arr[5];在程序运⼀就确定了数组的⼀⼀,运⼀过程不能更改数组的⼀⼀。
动态数组:主要是在堆区申请的空间,数组的⼀⼀是在程序运⼀过程中确定,可以更改数组的⼀⼀。
10、描述⼀下⼀维数组的不初始化、部分初始化、完全初始化的不同点不初始化:如果是局部数组数组元素的内容随机如果是全局数组,数组的元素内容为0 部分初始化:未被初始化的部分⼀动补0完全初始化:如果⼀个数组全部初始化可以省略元素的个数数组的⼀⼀由初始化的个数确定11、谈谈数组名作为类型、作为地址、对数组名取地址的区别?数组名作为类型:代表的是整个数组的⼀⼀数组名作为地址:代表的是数组⼀元素的地址对数组名取地址:代表的是数组的⼀地址12、谈谈你对⼀维数组在物理上以及逻辑上的数组维度理解⼀维数组在逻辑上是⼀维的,在物理上是⼀维的13、描述⼀下函数的定义与函数的声明的区别函数定义:是指对函数功能的确⼀,包括指定函数名、函数类型、形参及其类型、函数体等,它是⼀个完整的、独⼀的函数单位。
C语言八大排序算法

C语⾔⼋⼤排序算法C语⾔⼋⼤排序算法,附动图和详细代码解释!来源:C语⾔与程序设计、⽵⾬听闲等⼀前⾔如果说各种编程语⾔是程序员的招式,那么数据结构和算法就相当于程序员的内功。
想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。
⼆⼋⼤排序算法排序算法作为数据结构的重要部分,系统地学习⼀下是很有必要的。
1、排序的概念排序是计算机内经常进⾏的⼀种操作,其⽬的是将⼀组“⽆序”的记录序列调整为“有序”的记录序列。
排序分为内部排序和外部排序。
若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。
反之,若参加排序的记录数量很⼤,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。
2、排序分类⼋⼤排序算法均属于内部排序。
如果按照策略来分类,⼤致可分为:交换排序、插⼊排序、选择排序、归并排序和基数排序。
如下图所⽰:3、算法分析1.插⼊排序*直接插⼊排序*希尔排序2.选择排序*简单选择排序*堆排序3.交换排序*冒泡排序*快速排序4.归并排序5.基数排序不稳定排序:简单选择排序,快速排序,希尔排序,堆排序稳定排序:冒泡排序,直接插⼊排序,归并排序,奇数排序1、插⼊排序将第⼀个和第⼆个元素排好序,然后将第3个元素插⼊到已经排好序的元素中,依次类推(插⼊排序最好的情况就是数组已经有序了)因为插⼊排序每次只能操作⼀个元素,效率低。
元素个数N,取奇数k=N/2,将下标差值为k的数分为⼀组(⼀组元素个数看总元素个数决定),在组内构成有序序列,再取k=k/2,将下标差值为k的数分为⼀组,构成有序序列,直到k=1,然后再进⾏直接插⼊排序。
3、简单选择排序选出最⼩的数和第⼀个数交换,再在剩余的数中⼜选择最⼩的和第⼆个数交换,依次类推4、堆排序以升序排序为例,利⽤⼩根堆的性质(堆顶元素最⼩)不断输出最⼩元素,直到堆中没有元素1.构建⼩根堆2.输出堆顶元素3.将堆低元素放⼀个到堆顶,再重新构造成⼩根堆,再输出堆顶元素,以此类推5、冒泡排序改进1:如果某次冒泡不存在数据交换,则说明已经排序好了,可以直接退出排序改进2:头尾进⾏冒泡,每次把最⼤的沉底,最⼩的浮上去,两边往中间靠16、快速排序选择⼀个基准元素,⽐基准元素⼩的放基准元素的前⾯,⽐基准元素⼤的放基准元素的后⾯,这种动作叫分区,每次分区都把⼀个数列分成了两部分,每次分区都使得⼀个数字有序,然后将基准元素前⾯部分和后⾯部分继续分区,⼀直分区直到分区的区间中只有⼀个元素的时候,⼀个元素的序列肯定是有序的嘛,所以最后⼀个升序的序列就完成啦。
c语言面试题目100及最佳答案

c语言面试题目100及最佳答案作为IT行业人士需要掌握的最基本的计算机语言—c语言,如今的地位只高不低,c语言掌握程度的高低往往在面试的时候可以完全表现出来,而有些问题是大家平时似乎是知道的,但却不能完整准确地回答上来的,今天大家带来精心整理的C语言经典面试题,希望对大家有所帮助。
1、请填写bool , float, 指针变量与“零值”比较的if语句。
提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针”。
例如int 变量n 与“零值”比较的if 语句为:if ( n == 0 )if ( n != 0 )以此类推。
(1)请写出bool flag 与“零值”比较的if 语句:【标准答案】if ( flag ) if ( !flag )100 条经典 C语言笔试题目(2)请写出float x 与“零值”比较的if 语句:【标准答案】 const float EPSINON = 0.00001;if ((x >= - EPSINON) && (x <= EPSINON)不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
100 条经典 C语言笔试题目(3)请写出char *p 与“零值”比较的if 语句【标准答案】 if (p == NULL) if (p != NULL)2、以下为Linux下的32 位C 程序,请计算sizeof 的值。
char str[] = “Hello” ;char *p = str ;i nt n = 10;请计算(1)sizeof (str ) = (2)s i zeof ( p ) =(3)sizeof ( n ) =【标准答案】(1)6、(2)4 、(3 )4(4)void Func ( char str[100]){…… ;}请计算sizeof( str ) =(5)void * p = mall oc( 100 );请计算sizeof ( p ) =【标准答案】(4)4、(5)44、用变量a 给出下面的定义e) 一个有10个指针的数组,该指针是指向一个整型数的;f) 一个指向有10个整型数数组的指针;g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;【标准答案】e)int * a[10]; f)int (*a)[10]g)int (*a)(int); h) int (*a[10])(int)5、设有以下说明和定义:typedef u nion {long i; int k[5]; char c;} DATE; struct data { int cat; DATE cow; double dog;} too; DATE max;则语句printf("%d",sizeof(struct date)+sizeof(max)); 的执行结果是:_____【标准答案】DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20data 是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.所以结果是20 + 32 = 52.当然…在某些16位编辑器下, int 可能是2字节,那么结果是int2 + DATE10 + double8 = 206、请问以下代码有什么问题:int main(){char a;char *str=&a;strcpy(str,“hello”);printf(str);return 0;}【标准答案】没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。
常见算法笔试题

常见算法笔试题常见算法算法与数据结构是⾯试考察的重中之重,也是⽇后刷题时需要着重训练的部分。
简单的总结⼀下,⼤约有这些内容:算法 - Algorithms1、排序算法:快速排序、归并排序、计数排序2、搜索算法:回溯、递归、剪枝技巧3、图论:最短路、最⼩⽣成树、⽹络流建模4、动态规划:背包问题、最长⼦序列、计数问题5、基础技巧:分治、倍增、⼆分、贪⼼数据结构 - Data Structures1、数组与链表:单/双向链表、跳舞链2、栈与对列3、树与图:最近公共祖先、并查集4、哈希表5、堆:⼤/⼩根堆、可并堆6、字符串:字典树、后缀树递归与迭代的区别递归(recursion):递归常被⽤来描述以⾃相似⽅法重复事物的过程,在数学和计算机科学中,指的是在函数定义中使⽤函数⾃⾝的⽅法。
(A调⽤A )迭代(iteration):重复反馈过程的活动,每⼀次迭代的结果会作为下⼀次迭代的初始值。
(A重复调⽤B)递归是⼀个树结构,从字⾯可以其理解为重复“递推”和“回归”的过程,当“递推”到达底部时就会开始“回归”,其过程相当于树的深度优先遍历。
迭代是⼀个环结构,从初始状态开始,每次迭代都遍历这个环,并更新状态,多次迭代直到到达结束状态。
# 理论上递归和迭代时间复杂度⽅⾯是⼀样的,但实际应⽤中(函数调⽤和函数调⽤堆栈的开销)递归⽐迭代效率要低。
链接:https:///p/32bcc45efd32来源:简书算法的时间复杂度和空间复杂度时间复杂度和空间复杂度是⽤来评价算法效率⾼低的2个标准。
时间复杂度:就是说执⾏算法需要消耗的时间长短,越快越好。
⽐如你在电脑上打开计算器,如果⼀个普通的运算要消耗1分钟时间,那谁还会⽤它呢,还不如⾃⼰⼝算呢。
空间复杂度:就是说执⾏当前算法需要消耗的存储空间⼤⼩,也是越少越好。
本来计算机的存储资源就是有限的,如果你的算法总是需要耗费很⼤的存储空间,这样也会给机器带来很⼤的负担。
时间复杂度的计算表⽰⽅法我们⼀般⽤“⼤O符号表⽰法”来表⽰时间复杂度:T(n) = O(f(n)) n是影响复杂度变化的因⼦,f(n)是复杂度具体的算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C/C++笔试面试题目汇总3——各种排序算法原文:/u/1222/showart_318070.html排序算法是一种基本并且常用的算法。
由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。
而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。
在后面我将给出详细的说明。
对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。
我将按照算法的复杂度,从简单到难来分析算法。
第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。
第二部分是高级排序算法,复杂度为O(Log2(N))。
这里我们只介绍一种算法。
另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。
第三部分类似动脑筋。
这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。
同时也可以让我们从另外的角度来认识这个问题。
第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。
由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。
一、简单排序算法由于程序比较简单,所以没有加什么注释。
所有的程序都给出了完整的运行代码,并在我的VC环境下运行通过。
因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么问题的。
在代码的后面给出了运行过程示意,希望对理解有帮助。
1.冒泡法:(Gilbert:点这里有视频)这是最原始,也是众所周知的最慢的算法了。
他的名字的由来因为它的工作看来象是冒泡:#include <iostream.h>void BubbleSort(int* pData,int Count){int iTemp;for(int i=1;i<Count;i++){for(int j=Count-1;j>=i;j--){if(pData[j]<pData[j-1]){iTemp = pData[j-1];pData[j-1] = pData[j];pData[j] = iTemp;}}}}void main(){int data[] = {10,9,8,7,6,5,4};BubbleSort(data,7);for (int i=0;i<7;i++)cout<<data[i]<<" ";cout<<"\n";}倒序(最糟情况)第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)第一轮:7,8,10,9->7,8,9,10(交换1次)循环次数:6次交换次数:6次其他:第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)第一轮:7,8,10,9->7,8,9,10(交换1次)循环次数:6次交换次数:3次上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。
从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。
写成公式就是1/2*(n-1)*n。
现在注意,我们给出O方法的定义:若存在一常量K和起点n0,使当n>=n0时,有f(n)<=K*g(n),则f(n) = O(g(n))。
(呵呵,不要说没学好数学呀,对于编程数学是非常重要的)现在我们来看1/2*(n-1)*n,当K=1/2,n0=1,g(n)=n*n时,1/2*(n-1)*n<=1/2*n*n=K*g(n)。
所以(n)=O(g(n))=O(n*n)。
所以我们程序循环的复杂度为O(n*n)。
再看交换。
从程序后面所跟的表可以看到,两种情况的循环相同,交换不同。
其实交换本身同数据源的有序程度有极大的关系,当数据处于倒序的情况时,交换次数同循环一样(每次循环判断都会交换),复杂度为O(n*n)。
当数据为正序,将不会有交换。
复杂度为O(0)。
乱序时处于中间状态。
正是由于这样的原因,我们通常都是通过循环次数来对比算法。
2.交换法:交换法的程序最清晰简单,每次用当前的元素一一的同其后的元素比较并交换。
#include <iostream.h>void ExchangeSort(int* pData,int Count){int iTemp;for(int i=0;i<Count-1;i++){for(int j=i+1;j<Count;j++){if(pData[j]<pData[i]){iTemp = pData[i];pData[i] = pData[j];pData[j] = iTemp;}}}}void main(){int data[] = {10,9,8,7,6,5,4};ExchangeSort(data,7);for (int i=0;i<7;i++)cout<<data[i]<<" ";cout<<"\n";}倒序(最糟情况)第一轮:10,9,8,7->9,10,8,7->8,10,9,7->7,10,9,8(交换3次)第二轮:7,10,9,8->7,9,10,8->7,8,10,9(交换2次)第一轮:7,8,10,9->7,8,9,10(交换1次)循环次数:6次交换次数:6次其他:第一轮:8,10,7,9->8,10,7,9->7,10,8,9->7,10,8,9(交换1次)第二轮:7,10,8,9->7,8,10,9->7,8,10,9(交换1次)第一轮:7,8,10,9->7,8,9,10(交换1次)循环次数:6次交换次数:3次从运行的表格来看,交换几乎和冒泡一样糟。
事实确实如此。
循环次数和冒泡一样也是1/2*(n-1)*n,所以算法的复杂度仍然是O(n*n)。
由于我们无法给出所有的情况,所以只能直接告诉大家他们在交换上面也是一样的糟糕(在某些情况下稍好,在某些情况下稍差)。
3.选择法:现在我们终于可以看到一点希望:选择法,这种方法提高了一点性能(某些情况下)这种方法类似我们人为的排序习惯:从数据中选择最小的同第一个值交换,在从省下的部分中选择最小的与第二个交换,这样往复下去。
#include <iostream.h>void SelectSort(int* pData,int Count){int iTemp;int iPos;for(int i=0;i<Count-1;i++){iTemp = pData[i];iPos = i;for(int j=i+1;j<Count;j++){if(pData[j]<iTemp){iTemp = pData[j];iPos = j;}}pData[iPos] = pData[i];pData[i] = iTemp;}}void main(){int data[] = {10,9,8,7,6,5,4};SelectSort(data,7);for (int i=0;i<7;i++)cout<<data[i]<<" ";cout<<"\n";}倒序(最糟情况)第一轮:10,9,8,7->(iTemp=9)10,9,8,7->(iTemp=8)10,9,8,7->(iTemp=7)7,9,8,10(交换1次) 第二轮:7,9,8,10->7,9,8,10(iTemp=8)->(iTemp=8)7,8,9,10(交换1次)第一轮:7,8,9,10->(iTemp=9)7,8,9,10(交换0次)循环次数:6次交换次数:2次其他:第一轮:8,10,7,9->(iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交换1次) 第二轮:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交换1次)第一轮:7,8,10,9->(iTemp=9)7,8,9,10(交换1次)循环次数:6次交换次数:3次遗憾的是算法需要的循环次数依然是1/2*(n-1)*n。
所以算法复杂度为O(n*n)。
我们来看他的交换。
由于每次外层循环只产生一次交换(只有一个最小值)。
所以f(n)<=n所以我们有f(n)=O(n)。
所以,在数据较乱的时候,可以减少一定的交换次数。
4.插入法:插入法较为复杂,它的基本工作原理是抽出牌,在前面的牌中寻找相应的位置插入,然后继续下一张#include <iostream.h>void InsertSort(int* pData,int Count){int iTemp;int iPos;for(int i=1;i<Count;i++){iTemp = pData[i];iPos = i-1;while((iPos>=0) && (iTemp<pData[iPos])){pData[iPos+1] = pData[iPos];iPos--;}pData[iPos+1] = iTemp;}}void main(){int data[] = {10,9,8,7,6,5,4};InsertSort(data,7);for (int i=0;i<7;i++)cout<<data[i]<<" ";cout<<"\n";}倒序(最糟情况)第一轮:10,9,8,7->9,10,8,7(交换1次)(循环1次)第二轮:9,10,8,7->8,9,10,7(交换1次)(循环2次)第一轮:8,9,10,7->7,8,9,10(交换1次)(循环3次)循环次数:6次交换次数:3次其他:第一轮:8,10,7,9->8,10,7,9(交换0次)(循环1次)第二轮:8,10,7,9->7,8,10,9(交换1次)(循环2次)第一轮:7,8,10,9->7,8,9,10(交换1次)(循环1次)循环次数:4次交换次数:2次上面结尾的行为分析事实上造成了一种假象,让我们认为这种算法是简单算法中最好的,其实不是,因为其循环次数虽然并不固定,我们仍可以使用O方法。