算法与数据结构:
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. |