算法与数据结构知识点总结

算法与数据结构:

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.

展开阅读全文

没有更多推荐了,返回首页