排序与查找
Posted la-pu-ta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序与查找相关的知识,希望对你有一定的参考价值。
查找
搜索引擎
matching & ranking
- 索引技术
-
AltaVista:foward index 文档到关键词 / inverted index 关键词到文档
-
Google:PageRank
- ranking by hyperlink number
- ranking by authory of hyperlink
- Learning to Rank 机器学习(现在)
-
线性查找(顺序查找)
- 不要求数据表有序,记录关键词与key值比较
二分查找
- 要求数据有序
- 中间位置与key比较,相等则找到。否则,将原表分为左右两表
- 当
low>high
时,判断为未找到
//递归实现
int BinSearch(long num[],long x,int low,int long)
{
int mid=(high-low)/2+low; //防止数据溢出
if(low>high) return -1;
if(x>num[mid]) return BinSearch(num,x,mid+1,high);
else if(x<num[mid]) return BinSearch(num,x,low,mid-1);
else return mid;
}
排序
桶排序(计数排序)
将数据作为键值,数组需要为整数
选择排序(交换排序上改进)
void FindMin(int x[],int n)
{
int temp,j,i,key,min;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(x[j]<x[k]) //升序
k=j;
}
if(k!=i)
{
temp=x[k];
x[k]=x[i];
x[i]=temp;
}
}
}
冒泡排序
#include<stdio.h>
#include<stdlib.h>
void Swap(int *a, int *b);
void BubbleSort(int a[],int n);
int main(void)
{
int a[] = {5,2,47,2,0,1};
int n = sizeof(a)/sizeof(int);
BubbleSort(a,n);
int i;
for(i=0;i<n;i++) printf("%3d",a[i]);
return 0;
}
void BubbleSort(int a[], int n)
{
int i, j;
for(i=0;i<n-1;i++)
for(j=n-1;j>=1;j--)
if(a[j-1]>a[j]) Swap(&a[j-1],&a[j]);
}
void Swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
快速排序(Quick Sort)
#include<stdio.h>
#include<stdlib.h>
void QuickSort(int a[],int left,int right);
void Swap(int *a,int *b);
int QuickPartition(int a[],int left,int right);
int main(void)
{
int a[] = {5,2,47,2,0,1};
int n = sizeof(a)/sizeof(int);
QuickSort(a,0,n-1);
int i;
for(i=0;i<n;i++) printf("%3d",a[i]);
return 0;
}
void QuickSort(int a[],int left, int right)
{
int t;
if(left<right)
{
t = QuickPartition(a,left,right);
QuickSort(a,left,t-1);
QuickSort(a,t+1,right);
}
}
int QuickPartition(int a[],int left,int right)
{
int i = left, j = right, base = a[left];
while(i<j)
{
while(i<j && a[j]>=base) j--;
while(i<j && a[i]<=base) i++;
if(i<j) Swap(&a[i],&a[j]);
}
Swap(&a[i],&a[left]);
return i;
}
void Swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
插入一个数据到有序数列中
思路:边找边移
void InsertSort(int a[],int n)
{
int i,j,x;
for(j=1;j<n;j++)
{
x=a[j];
for(i=j-1;i>=0&&a[i]>x;i--)
{
a[i+1]=a[i];
}
a[i+1]=x;
}
}
!-->以上是关于排序与查找的主要内容,如果未能解决你的问题,请参考以下文章