数据结构与算法
刘宣东
Live and learn
展开
-
排序算法之鸡尾酒排序
鸡尾酒排序 鸡尾酒排序实际上是一种双向的冒泡排序。第一趟,从0开始到size-1前往后做“冒泡”,将最大值移动到最后(下标为size-1)。第二趟,从size-2开始到0从后往前做“冒泡”,将最小值移动到最前面(下标为0)。第三趟,从1开始到size-2从前往后做“冒泡”,将最大值移动到最后(下标为size-2)。第四趟,从size-3开始到1从后往前做“冒泡”,将最小值移动到最前面(下标为原创 2015-11-04 12:51:30 · 629 阅读 · 0 评论 -
排序算法之桶排序
桶排序 桶排序的基本思想就是待排序的数据分别放入不同的桶中,这些桶之间其实是有序的。然后在这些桶中将分在里面的数据进行排序。最终就完成了整个序列的排序。 假设将一个均匀分布在区间[0,200)的一些待排序的序列,分成20个桶中。每个桶的大小都是10。分别存数据[0, 9), [10, 19), [20, 29) …. [190, 199),将待排序数组中的数据分别存进这些桶中,然原创 2015-10-31 00:39:02 · 611 阅读 · 0 评论 -
排序算法之快速排序
快速排序 快速排序是在待排序序列中选定一个数(一般以选择第一个数),然后将待排序序列这样处理:以选定的这个数为基准,这个数的左边存放比它小的数,右边存放比它大的数。处理完之后去右边的区间选定一个数继续进行这样的过程,去右边的区间选定一个数继续进行这样的过程。 例如序列{50, 10, 90, 30, 70, 40, 80, 60, 20}。第一趟时,选择50为基准,做一个循环将比原创 2015-10-29 23:43:00 · 502 阅读 · 0 评论 -
排序算法之鸽巢排序
计数排序 计数排序的执行速度快于任何一种排序,但其却需要很大的辅助空间。计数排序的辅助数组的大小取决与待排序数组的数值范围,辅助空间的大小为待排序数组中的最大值与最小值之差加1。比如有序列{11, 13, 56, 23, 63, 23, 98 ,87},则复制数组需要98-11+1=88个空间。 最初时辅助数组中初始化为0,扫描待排序数组时,将待排序序列中的每一个数减去最小值当作原创 2015-10-29 22:41:32 · 3660 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡排序 冒泡排序是比较相邻的值,如果反序,那么就将这两个数交换,那么循环到最后的时候将会把最大的数交换到最末尾。 例如序列 {2, 4, 8, 6 ,9 ,12, 7, 11, 1, 3, 5,10} 冒泡排序刚开始会比较2与4,顺序正确,则比较4与8,接着比较8与6,反序,交换8与6。则序列变为{2, 4, 6,8,9 ,12, 7, 11, 1, 3, 5,10原创 2015-10-28 17:47:07 · 345 阅读 · 0 评论 -
排序算法之直接选择排序
直接选择排序 直接选择排序是将整个待排序序列分为两部分,一部分为有序(最开始有序序列为空),一部分为无序(最终无序序列为空)。有序序列中的数都不大于无序序列中的数。它的过程是每次都在无序中寻找一个最小的数,然后将其与无序序列的第一个数交换,并并入有序序列。则有序序列长度增1,无序序列长度减1。 比如:对R[0….n]数组进行选择排序。其中R[0…i]为有序,R[i+1…n]为无序原创 2015-10-28 15:58:06 · 621 阅读 · 0 评论 -
排序算法之梳排序
排序算法之梳排序 基本思想:梳排序和希尔排序很类似。希尔排序是在直接插入排序的基础上做的优化,而梳排序是在冒泡排序的基础上做的优化。也是想希尔排序一样,将待排序序列通过增量分为若干个子序列,然后对子序列进行一趟冒泡排序,一步步减小增量,直至增量为1。所以梳排序的最后一次排序是冒泡排序。 梳排序增量是根据递减率减小的,递减率的设定影响着梳排序的效率,原作者以随机数作实验,得到最有效原创 2015-12-04 09:50:50 · 2770 阅读 · 3 评论 -
排序算法之Bogo排序
排序算法之Bogo排序 基本思想:运气!!!!!!!! Bogo排序算是一个恶搞排序,它将一切交给了上帝。Bogo排序每一趟都在检测待排序序列是否有序,如果有序,结束。如果无序,将待排序序列随机打乱(随机打乱!!!!!),重新检测。 举例:待排序序列{8, 2, 3, 4, 5, 1, 6 , 7}。 (1){1, 2, 3, 4, 5, 6, 7, 8}原创 2015-12-04 10:32:59 · 9723 阅读 · 1 评论 -
排序算法之耐心排序
排序算法之耐心排序 耐心排序的基本思想:耐心排序还是对插入排序做的一种优化,先将数据调整为基本有序,再进行一次插入排序。耐心排序的关键点是在建桶和入桶的规则上面。 (1)如果还没有桶,新建一个桶。如果不符合入桶规则那么新建一个桶。 (2)要入桶的数字只要比桶里最上面的数字小,即可入桶;如果有多个桶可入,则按照从左到右的顺序入桶。 举例:有待排序序列6, 3原创 2015-12-03 09:10:30 · 2060 阅读 · 2 评论 -
排序算法之珠排序
排序算法之珠排序 基本思想:将每个数用珠子表示,例如:数字5就是5个珠子。用珠子表示好每一个数后,让所有的珠子自由下落。排序完成。 例如:数字,{6, 2, 4, 1, 5, 9} (1)将这些数都用珠子表示。 (2)让珠子自由下落。完成了排序{1, 2, 4, 5, 6, 9}BOOL Bead原创 2015-12-03 11:53:32 · 2083 阅读 · 0 评论 -
排序算法之地精排序
排序算法之地精排序 地精排序是最简单的排序算法,它只用一重循环就可以实现。它也像冒泡排序一样,相邻元素之间两两进行比较,如果这两个元素逆序,则交换。与冒泡排序不同的是,它如果遇到交换操作时,变为向前冒泡,直至不发生交换操作位置。相当于做了一个插入操作,将比较小的数插入到前面的有序序列中合适的位置。所以,地精排序可以说是冒泡排序和直接插入排序的综合。 其排序过程如下:循环变量i初值原创 2015-11-22 11:29:07 · 3592 阅读 · 1 评论 -
排序算法之奇偶排序
排序算法之奇偶排序 奇偶排序的基本思想就是先对奇数列进行一趟排序,比较奇数列和其相邻的偶数列的元素,如果逆序则交换。再对偶数列进行一趟排序,比较偶数列和其相邻的奇数列的元素,如果逆序则交换。接着对奇数列进行排序,再对偶数列进行排序,重复进行这样的过程,直到奇数列排序和偶数列排序都没有进行交换操作为止。 例如:待排序序列{6, 2, 4, 1, 5,7} 对奇数列和其相原创 2015-11-23 15:43:19 · 2651 阅读 · 0 评论 -
排序算法之直接插入排序
直接插入排序直接插入排序的基本思想就是将一个记录插入到一个排好序的有序表中,从而得到一个新的有序表。 假设一个线性表R[0…n], R[0…i]是有序的,则直接插入排序就是将R[i+1]插入到有序表R[0…i]中,从而使R[0…i+1]成为一个有序表。重复以上的操作,直至将R[n]插入到R[0…n-1]中,则R[0…n]最终成为一个有序的线性表。 实现插入排序(一):有监视哨 设置R[0]为监原创 2015-10-28 14:40:10 · 349 阅读 · 0 评论 -
排序算法之折半插入排序
折半插入排序 在直接插入排序的基础上做的改进,直接插入排序在寻找插入位置时是从后到前依次比较,直到找到插入位置。而折半插入排序在寻找插入位置时,先与有序序列中的中间位置R[mid]进行比较,如果比中间位置上的记录大,则在R[mid+1…N]中寻找,继续与右区间的中间记录进行比较;如果比中间位置上的记录小,则在R[0…mid-1]中寻找,继续与左区间中的数据进行比较。int BinaryInse原创 2015-10-28 14:56:48 · 3299 阅读 · 0 评论 -
排序算法之希尔排序
希尔排序 希尔排序是对插入排序的一种改进,它其实是先将整个序列分为一些子序列,然后分别对这些子序列进行排序,排序后之后,再将整个序列分为比前一次序列规模大的子序列,再对这些子序列进行排序,继续这样的操作。直至将整个序列只分为一个子序列,即序列本身。希尔排序其实上是将整个序列慢慢变的基本有序。 希尔排序比较重要的是增量序列。它利用增量序列将整个序列分割为多个子序列。 比如有序原创 2015-10-28 15:41:05 · 440 阅读 · 0 评论 -
排序算法之二路归并排序
二路归并排序 int MergeSort(datatype *array, int low, int high){ int i, j, k; int mid; int *temp; if(array == NULL) { return -1; } if(low >= high) {原创 2015-11-01 23:14:12 · 18738 阅读 · 3 评论