计算机算法与设计3(排序算法的复习)

一、冒泡排序

定义:冒泡排序是一种极其简单的排序算法。它重复地走访过要排序的元素,一次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。

操作步骤

  1. 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
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. 定义:归并排序的实现分为递归实现与非递归(迭代)实现。
    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)
    }
}

三、快速排序

定义:数组中的每个元素与基准值比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边,直到排序结束

操作步骤

  1. 从序列中挑出一个元素,作为"基准"(pivot)
  2. 把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。
  3. 对每个分区递归地进行步骤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.取中位数比较

  1. 相等 返回下标
  2. 比中位数大 提高取中位数的下界 再次折半查找
  3. 比中位数小 降低取中位数的上界 再次折半查找
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)
}
发布了122 篇原创文章 · 获赞 221 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/jjsjsjjdj/article/details/103831514