随笔分类 - 算法
摘要:#include <iostream>using namespace std;void print_r(int *a, int length){ for (int i = 0; i < length; ++i) cout << a[i] << ' '; cout << endl;}void q_sort(int *a, int length){ if (length == 1) { return ; } if (length == 2) { if (a[0] > a[1]) swap(a[0], a[1]); retu
阅读全文
摘要:堆排序是一种高效的比较排序算法,运行时间为O(nlgn)。这种排序需要用到一种叫做(二叉)堆的数据结构,堆是一种数组对象,也可以看做一颗完全二叉树,对于任一节点,左右子节点和父节点分别可如下简单算出 PARENT(i) ((i - 1) / 2) LEFT(i) (2 * i + 1) RIGHT(i) (2 * i + 2)堆分为大根堆和小根堆,分别具有如下性质: a[PARENT(i)] >= a[i] a[PARENT(i)] <= a[i]本文采用大根堆说明堆排序算法的实现。c++实现源代码如下:#include <iostream>using namespac
阅读全文
摘要:归并排序是一种高效的排序算法,时间复杂度为nlogn,与快排相当,是分治法的一种典型应用。归并排序的思想是将若干个有序的序列合并为一个有序序列,常用的是二路归并,也就是将两个有序子序列合并为一个序列。归并排序可用递归完成,第一次排序将序列分成两部分,第二次排序将两序列在分成两部分,如此下去,直到每个子序列只有一个元素,则子序列自然有序,然后合并即可。归并操作的工作原理如下: 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置 3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下...
阅读全文
摘要:闲着没事,做个小小的测试,测试一下冒泡,选择,插入和快速四种排序对同一个含有1000000个元素的数组排序所用的时间,做个比较。四种排序的代码如下:冒泡排序:template <typename T>
void bubble_sort(T a[], int num){ if(num ==0 || num == 1) return ; bool changed = false; do{ for(int i=0; i<num-1; i++){ if(a[i] < a[i+1]){ swap(a[i], a[i+1]); changed = true; }
...
阅读全文
摘要:快速排序是一种效率很高的排序,具有最好nlogn,最坏n2的复杂度,总的来说,快排的效果是非常好的,如果有兴趣研究算法性能的分析,推荐阅读《算法导论》,我在这里就不分析了,也分析不明白。总之,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。举个例子:a[5] = {4, 2, 5, 3, 1}假如选第一个元素为分割元素,第一趟排序之后的序列为:2 3 1 4 5左边的序列为(左一)2 3 1右边的序列为(右一)5递归排序左右两序
阅读全文
摘要:选择排序是一种不稳定的排序方法,排序思想比较简单,大致可描述为:每次在待排序元素中选出最小元素,放到前面,如此下去,每次选出的都是剩余元素的最小元素,直至待排序元素只剩一个时,排序结束,演示过程如下:设待排序有n个元素,分别为[1...n],未排序时,有序区元素个数为零,无序区元素个数为n。以五个元素为例,a[5] = {5, 4, 3, 2, 1}第一趟排序从无序区选出最小元素为1,与无序区第一个元素5交换,得到序列1 4 3 2 5这时1为有序区,4 3 2 5为无序区第二趟排序在新的无序区中选出最小元素为2,与无序区的第一个元素4交换,得到序列1 2 3 4 5这时1 2为有序区,3 4
阅读全文
摘要:冒泡排序是一种简单实用的排序算法。是稳定的。其基本思想为:从第一个元素开始,与相邻的后一个比较,如果前一个元素大于后一个元素,则元素交换,否则不动;然后比较第二个和第三个,前大后小则交换,否则不换;如此下去,比较完第n-1个和第n个元素之后,第一趟排序结束,此时最大的元素被换到了最后面。第二趟继续以上动作,只比较前n-1个元素即可,因为最大的已经到了最后面,无需再比较,第二趟结束后,这时倒数第二大的元素被换到了倒数第二个位置。继续如此比较,n-1趟之后第二小的元素被放到了第二位,这时排序结束。算法演示如下:给定序列 5 4 3 2 1第一趟排序演示: 第一次比较:4 5 3 2 1 第二次比较
阅读全文

浙公网安备 33010602011771号