算法笔记
文章平均质量分 69
ShuwenLau
Know thyself, nothing in excess.
展开
-
三向切分的快速排序
对于存在大量重复元素的数组,这种方法比标准的快速排序的效率高得多。原创 2015-07-28 11:28:27 · 623 阅读 · 0 评论 -
希尔排序
/*交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。思想是使数组中任意间隔为h的元素都是有序的。实现希尔排序的一种方法是对于每个h,用插入排序将h个子数组独立地排序。但因为子数组是相互独立的,一个更简单的方法是在h-子数组中将每个元素交换到比它大的元素之前去(将比它大的元素向右移动一格)。希尔排序更高效是因为权衡了子数组的规模和有序性。对于中等大小的数组,它原创 2015-07-17 17:53:46 · 360 阅读 · 0 评论 -
带哨兵与不带哨兵的插入排序
/*插入排序所需的时间取决于输入中元素的初始顺序 */#includeusing namespace std;const int arraySize=10;int main(){ int a[10]={1,6,2,4,3,5,8,7,9,0}; int temp; for(int i=0;i<arraySize;i++){ for(int j=i; j>0 && a[j]<a原创 2015-07-17 17:19:44 · 1122 阅读 · 0 评论 -
选择排序
首先,找到数组中最小的那个元素,其次,讲它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。对于长度为N的数组,选择排序需要大约N^2/2次比较和N次交换。特点:运行时间和输入无关。数据移动是最少的。#includeusing namespace std;con原创 2015-07-17 17:03:30 · 255 阅读 · 0 评论 -
归并排序
/*一种基于比较的排序算法,基本思想为分冶。时间复杂度为θ(nlogn)。性质:稳定,即相等的项彼此的相对位置不会发生改变。*/void mergeSort(int* A,int x,int y,int* T){ if(y-x>1) { int m=x+(y-x)/2; //划分 int p=x,q=m,i=x; mergeSort(A,x,m,T);//递归求解原创 2015-07-17 18:53:45 · 256 阅读 · 0 评论 -
堆排序
#includeusing namespace std;void heap(int *a,int i,int size){ int left=2*i; int right=2*i+1; int tag=i; if(i<=size/2){ if(lefta[tag]) tag=left; if(righta原创 2015-07-19 17:09:23 · 265 阅读 · 0 评论 -
Cantor 康拓展开
const int PermSize = 10;long long factory[PermSize]={0,1,2,6,24,120,720,5040,40320,362880};long long Cantor(string buf){ int i, j, counted; long long result = 0; for(i = 0; i < PermSiz原创 2015-08-03 21:22:20 · 482 阅读 · 0 评论