一、冒泡排序
定义:冒泡排序是一种极其简单的排序算法。它重复地走访过要排序的元素,一次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。
操作步骤
- 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
void BubbleSort(int a[], int len)
{
int i, j, temp;
for (j = 0; j < len - 1; j++)
{
for (i = 0; i < len - 1 - j; i++)
if (a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
二、归并排序
- 定义:归并排序的实现分为递归实现与非递归(迭代)实现。
1. 递归实现的归并排序是算法设计中分治策略的典型应用,我们将一个大问题分割成小问题分别解决,然后用所有小问题的答案来解决整个大问题。
2. 非递归(迭代)实现的归并排序首先进行是两两归并,然后四四归并,然后是八八归并,一直下去直到归并了整个数组。
操作步骤
2. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
3. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
4. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
5. 重复步骤3直到某一指针到达序列尾
6. 将另一序列剩下的所有元素直接复制到合并序列尾
void Midsort(int a[],int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
Midsort(low,mid,a);
Midsort(mid+1,high,a);
Merge(low,high,a)
}
}
三、快速排序
定义:数组中的每个元素与基准值比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边,直到排序结束
操作步骤
- 从序列中挑出一个元素,作为"基准"(pivot)
- 把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。
- 对每个分区递归地进行步骤1~3,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。
void Ksort(int a[ ],int low,int high)
{
p=part(a,low,high)
Ksort(a,low,p-1)
Ksort(a,p+1,high)
}
四、折半查找
定义:折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组已经为空,则表示找不到指定的元素。
操作步骤
1.将无序的数组有序的进行排列
2.取中位数比较
- 相等 返回下标
- 比中位数大 提高取中位数的下界 再次折半查找
- 比中位数小 降低取中位数的上界 再次折半查找
Mid_Find(int a[],int low,int high)
{
mid=(high+low)/2
if(a[mid] == x )
return mid
if(a[mid] > x)
return Mid_Find(a,low,mid-1)
if(a[mid] < x)
return MId_Find(a,mid+1,high)
}