重温排序算法

因为复试时老师比较喜欢问排序算法那,所以 最近又把排序算法温习一遍,顺便写写代码。

1直接插入排序。

#include <stdio.h>

void InsSort(int r[], int n)
{
	int i, j, temp;
	for(i = 1; i < n; i++)
	{
		temp = r[i];
		j = i - 1;
		while(temp < r[j]) //寻找带插入的位置
		{
			r[j+1] = r[j];
			j = j - 1;
		}
		r[j+1] = temp; //将数值插入已排序的队列中
	}
}

void print(int r[], int n)
{
	int i;
	for(i = 0; i < n; i++)
		printf("%d ", r[i]);
	puts("\n");
}

int main()
{
	int a[10] = {3, 1, 5, 2, 7, 8, 9, 4, 6, 0};
	printf("before sort:\n");
	print(a, 10);
	InsSort(a, 10);
	printf("sort after:\n");
	print(a, 10);
	return 0;
}

 

如上述代码:temp变量用于放置带插入数值。

直接插入算法的空间复杂度O(1),因为只用到了1个变量

空间复杂度取决于待排序数列。最好的情况下移动次数 2 * (n-1), 最坏的情况下移动次数(n+4) * (n-1) / 2 , 平均复杂度n^2 / 4,因此时间复杂度位0(n^2)

时间: 2024-11-17 00:31:30

重温排序算法的相关文章

躲不掉的“排序算法”

排序算法,以前米老师讲VB的时候就讲过排序,随机显示10个数,并显示最大的数.利用冒泡.希尔等等排序算法都讲过,这次数据机构导论再次遇到,软考再次遇到,应该算是比较容易的一项吧. 学习完数据结构导论,又进一步了解到了排序算法.我们都知道,排序是数据处理的一种运算,因为数据处理花费的时间很多,人么为了提高计算机的运行效率而提出了各种各样的排序算法. 用米老师的话说就是"两两比较交换". 比较两个关键字的大小,将记录从一个位置移动到另一个位置. 排序的稳定性: 判断稳定性,通过相同键值的两

(转)java 排序算法

排序算法汇总(java实现,附源代码) 整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了.下面是总结的几个常用的排序算法: 插入排序 快速排序 冒泡排序 堆排序 计数排序 桶排序 可能大家对插入排序,快速排序,冒泡排序比较常用,在满足需求的时候也简单一些,下面逐一说一下每个算法的实现方式,不保证是写的最有效率的,但是能保证的是,各种算法的中心思想是

用HTML5实现的各种排序算法的动画比较 及算法小结

用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinaunix.net/uid-20773165-id-1847742.html 1.稳定性比较 插入排序.冒泡排序.二叉树排序.二路归并排序及其他线形排序是稳定的 选择排序.希尔排序.快速排序.堆排序是不稳定的 2.时间复杂性比较 插入排序.冒泡排序.选择排序的时间复杂性为O(n2) 其它非线形排序的时间复杂

8种主要排序算法的C#实现

新的一年到了,很多园友都辞职要去追求更好的工作环境,我也是其中一个,呵呵! 最近闲暇的时候我开始重温一些常用的算法.老早就买了<算法导论>,一直都没啃下去. 这本书确实很好,只是太难读了,总是读了几章就又读不下去了!工作上也几乎用不到. 我这段时间发现看这些排序算法比以前容易了很多,就借此机会将它们整理总结起来. 一是方便以后重温,二是可以应对笔试面试.同时也希望这篇博文可以帮助各位刚辞职和正在学习排序算法的园友. PS:有可能实现的代码并不是最优的,如果有什么错误或者值得改进的地方,还请大家

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

排序算法比较及其应用

一.将各种数据排序 只要实现了Comparable接口的数据类型就可以被排序. 但要使算法能够灵活地用不同字段进行排序,则是后续需要考虑的问题. 1.指针排序 在Java中,指针操作是隐式的,排序算法操作的总是数据引用,而不是数据本身. 2.键不可变 如果在排序后,用例还可以改变键值,那么数组很可能就不是有序的了.类似,优先队列也会乱套. Java中,可以用不可变数据类型作为键来避免这个问题,如String,Integer,Double和File都是不可变的. 3.廉价交换 使用引用的另一个好处

选择排序 —— 排序算法系列

假设我们有如下一个数组: 使用选择排序算法对这个数组进行排序,步骤如下: 第 1 次 在下标0到6之间找到最小的数字,我们可以发现最小的数字是15,它在下标为4的位置上: 把下标4上面的数字跟下标0上面的数字互换,得到排序如下图的数组: 第 2 次 在下标1到6之间找到最小的数字,我们可以发现最小的数字是33,它在下标为5的位置上: 把下标5上面的数字跟下标1上面的数字互换,得到排序如下图的数组: 第 3 次 在下标2到6之间找到最小的数字,我们可以发现最小的数字是48,它在下标为5的位置上:

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

排序算法总结

各种排序算法总结  排序算法  插入排序 冒泡排序  选择排序  归并排序  快速排序 堆排序  计数排序  基数排序  桶排序  思想  构建有序序列 两两交换 每次找一个最小值 分治法思想 分治法思想 最小堆.最大堆 数字本身的属性  对数据选择多种基数  函数的映射关系.Hash  数据结构  数组  数组  数组  数组 不定   数组 数组 数组  数组  最差时间复杂度 O(n^2)   O(n^2)   O(n^2)   O(n*lgn)  O(n^2).改进O(n*lgn)  O