堆排序
转自 http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html
/*堆排序(大顶堆) */ 大顶堆性质:i子节点 2*i,右子节点2*i+1,父节点 i/2,最后一个非叶节点 size/2 对数组下标[1,size] size个元素进行排序 #include <iostream> #include<algorithm> using namespace std; void HeapAdjust(int *a,int i,int size) //调整堆 { int lchild=2*i; //i的左孩子节点序号 int rchild=2*i+1; //i的右孩子节点序号 int max=i; //临时变量 if(i<=size/2) //如果i是叶节点就不用进行调整 { if(lchild<=size&&a[lchild]>a[max]) { max=lchild; } if(rchild<=size&&a[rchild]>a[max]) { max=rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆 } } } void BuildHeap(int *a,int size) //建立堆 { int i; for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2 { HeapAdjust(a,i,size); } } void HeapSort(int *a,int size) //堆排序 { int i; BuildHeap(a,size); for(i=size;i>=1;i--) { //cout<<a[1]<<" "; swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 //BuildHeap(a,i-1); //将余下元素重新建立为大顶堆 HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆 } }
快速排序
转自 http://blog.csdn.net/morewindows/article/details/6684558
- //快速排序
- void quick_sort(int s[], int l, int r)
- {
- if (l < r)
- {
- //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换
- int i = l, j = r, x = s[l];
- while (i < j)
- {
- while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
- j--;
- if(i < j)
- s[i++] = s[j];
- while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
- i++;
- if(i < j)
- s[j--] = s[i];
- }
- s[i] = x;
- quick_sort(s, l, i - 1); // 递归调用
- quick_sort(s, i + 1, r);
- }
- }
二分查找
转自 http://www.cnblogs.com/xwdreamer/archive/2012/05/07/2487246.html
//不适用递归,如果存在返回数组位置,不存在则返回-1 int BinarySearch(int arry[],int len,int value) { //如果传入的数组为空或者数组长度<=0那么就返回-1。防御性编程 if(arry==NULL||len<=0) return -1; int start=0; int end=len-1; while(start<=end)//判断清是否有= { int mid=start+(end-start)/2; if(arry[mid]==value) return mid; else if(value<arry[mid]) end=mid-1; else start=mid+1; } return -1; }