A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 枫叶路过123 中级黑马   /  2014-11-5 00:58  /  1400 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

算法与数据结构:
1.数据结构:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型(DAT)。
2.算法:有穷性、确定性、可行性、输入(0个或多个)、输出(1个或者多个输出)。
3.排序算法:
    冒泡排序:每次找出最大值,然后放到所在范围的最后一位(是一种简单的易于理解的排序算法,但是效率很低,由于循环一次,只是要找出最大元素,好多元素的交换是没有意义的);
    选择排序 :每次找出最小值,放在指定范围的最前面,并且将最小值所在位置和第一个元素交换位置。(关键是找出指定范围内的最小元素下标,交换的次数较少)
    快速排序:每次找出一个轴点,将轴点分为两部分做同样的操作。效率很高的排序算法。
4.查找:
    顺序排序:从前往后查找,不靠谱的算法
    二分查找:必须是有序的表,从中间分为两个部分。
    注:循环的终止条件就是递归的终止条件,递归函数不需要循环。
    5.链表:和数组类似,只是数组大小固定,不能动态的更改数组大小,数据的插入和删除困难,但是可以快速的读取元素。链表的元素存储单元,可以使连续的,也可以是不连续的。是有多个node连接起来,但是快速定位比较慢。
    清空链表的时候,只保留首节点,首先,我们应该得到当前的节点,保存到一个node里面,然后将当前节点指向next,删除node。注:最后应该将first的next设置为NULL。
    链表的合并:就是讲两个链表联合在一起,将首节点去掉。
程序:
1.选择排序:
//最小元素下标
int minkey(int *p, int low, int high)
{
    int key = p[low];
    int min = low;
    int i;
    for (i = low + 1; i<high; i++)
    {
        if (key > p[i])
        {
            key = p[i];
            min = i;
        }
    }
    return min;
}
//选择排序算法
void select(int p[], int low, int high)
{
    int i, j;
    for (i = low; i < high; i++)
    {
        j = minkey(p, i, high);
        if (j != i)
        {
            swap(&p[j], &p[i]);
        }
    }
}
思路:要在指定范围内找到最小的元素位置;如果指定范围内的第一个元素不是最小元素,将最小元素和第一个元素交换位置,如果是的话,就结束。
2.快速排序:
int partition(int p[], int low, int high)
{
int povitkey = p[low];//轴点等于第一个元素
while (low < high)
{
while (low < high && p[high] >= povitkey)
    high--;
    p[low] = p[high];//将小于轴点的元素放到轴点的前面
while (low < high && p[low] <= povitkey)
    low++;
    p[high] = p[low];//将大于轴点的元素放到轴点的后面
    }
    p[low] = povitkey;
    return low;//返回轴点的下标
}
void q_sort(int p[], int low, int high)
{
    if (low < high)
    {
        int povitloc = partition(p, low, high);//对轴点进行排序,并且得到排序后轴点的位置
        q_sort(p, povitloc + 1, high);//递归对轴点的下半部分排序
        q_sort(p, low, povitloc - 1);//递归对轴点的上半部分排序
    }
}
void quick_sort(int p[], int low, int high)
{
    q_sort(p, low, high - 1);
}
思路:建立一个轴点(将第一个元素作为轴点),将大于轴点的值,依次放到轴点的右边,反之,放在左边;将轴点分为两部分做相同的操作。
3.快速查找 :不需要排序效率低
int bin(int s[], int low, int high, int data)
{
    int i;
    for(i = low; i < high; i++)
    {
        if(data == s[i])
            return i;
    }
    return - 1;
}

4.二分查找:需要排序
//循环实现
int bin(int s[], int low, int high, int data)
{
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (s[mid] == data)
            return mid;
        else if (data > s[mid])
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;
}
//递归实现
int bin1(int s[], int low, int high, int data)
{
int mid = (low + high) / 2;
if(low <= high)
{
if (data == s[mid])
        return mid;
else if (data > s[mid])
    return bin1(s, mid + 1, high, data);
else
    return bin1(s, low, mid - 1, data);
    }
    return -1;
}
思路:在有序集合内分为两部分,如果中间元素正好和data相等,那么就返回;如果大于data,那就在前半部分,那就将前半部分作为一个整体,然后再比较;如果小于data,那就在后半部分,那就将后半部分作为一个整体,然后再比较;如果没有找到,就返回-1.

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马