排序与查找

Posted la-pu-ta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序与查找相关的知识,希望对你有一定的参考价值。

查找

搜索引擎

matching & ranking

  • 索引技术
    • AltaVista:foward index 文档到关键词 / inverted index 关键词到文档

    • Google:PageRank

      1. ranking by hyperlink number
      2. ranking by authory of hyperlink
      3. Learning to Rank 机器学习(现在)

线性查找(顺序查找)

  • 不要求数据表有序,记录关键词与key值比较

二分查找

  • 要求数据有序
    1. 中间位置与key比较,相等则找到。否则,将原表分为左右两表
    2. 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;
    }
}

个人网站:DiffidentAres’s Blog

以上是关于排序与查找的主要内容,如果未能解决你的问题,请参考以下文章

从搜索文档中查找最小片段的算法?

数据结构 动态查找与二叉排序树

查找与排序:选择排序二分查找

python实现二分查找与冒泡排序

搜索与排序—— 顺序查找与二分查找

20172308 实验三《程序设计与数据结构》查找与排序 实验报告