数据结构与算法 – 清风博客 https://www.skyfinder.cc 关注IT世界,记录平凡生活 Thu, 12 Jul 2018 07:34:45 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.7.2 七种查找算法 https://www.skyfinder.cc/2016/12/17/algorithmforseven/ https://www.skyfinder.cc/2016/12/17/algorithmforseven/#respond Sat, 17 Dec 2016 06:26:20 +0000 http://www.skyfinder.cc/?p=26 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。由于查找运算的使用频率很高,几乎在任何一个计算机系统软件和应用软件中都会涉及到,所以当问题所涉及的数据量相当大时,查找方法的效率就显得格外重要。

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

  查找算法分类:
  1)静态查找和动态查找;
    注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。
  2)无序查找和有序查找。
    无序查找:被查找数列有序无序均可;
    有序查找:被查找数列必须为有序数列。
  平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。
  对于含有n个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci的和。
Pi:查找表中第i个数据元素的概率。
Ci:找到第i个数据元素时已经比较过的次数。
  • 顺序查找(Sequential Search)

在表的组织方式中,线性表是最简单的一种。顺序查找是一种最简单的查找方法。

1、顺序查找的基本思想
基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。

2、顺序查找的存储结构要求
顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构(使用单链表作存储结构时,扫描必须从第一个结点开始)。

3、复杂度分析:
查找成功时的平均查找长度为:(假设每个数据元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;当查找不成功时,需要n+1次比较,时间复杂度为O(n);所以,顺序查找的时间复杂度为O(n)。

4、顺序查找的优点
算法简单,且对表的结构无任何要求,无论是用向量还是用链表来存放结点,也无论结点之间是否按关键字有序,它都同样适用。

5、顺序查找的缺点
查找效率低,因此,当n较大时不宜采用顺序查找

C# 语言实现:


public int SequentialSearch(int[] data, int key) 
{
	int len = data.Length;
	int index=-1;
	for (int i = 0; i < len; i++) 
	{
		if (data[i] == key) 
		{
			index = i;
			break;
		}
	}
	return index;
}

转载请注明:清风博客 » 七种查找算法

]]>
https://www.skyfinder.cc/2016/12/17/algorithmforseven/feed/ 0
快速排序算法(Quicksort) https://www.skyfinder.cc/2016/07/05/quicksort/ https://www.skyfinder.cc/2016/07/05/quicksort/#respond Tue, 05 Jul 2016 07:28:51 +0000 http://www.skyfinder.cc/?p=68 一、排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各种排序算法。目前,最常见的排序算法大概有七八种,其中”快速排序”(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934–)于1960时提出来的。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1) 分治法的基本思想
将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

(2)快速排序的基本思想,整个排序过程只需要三步

  • 在数据集之中,选择一个元素作为”基准”(pivot)。
  • 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。
  • 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

二、快速排序算法实现:

JavaScript:


function QuickSort(arr, left, rigth) {
    var i = left;
    var j = rigth;
    var povit = Math.floor((left + rigth) / 2);
    var con = arr[povit];
    while (i <= j) {
        while (arr[i] < con) { i++; } while (arr[j] > con) {
            j--;
        }
        if (i <= j) {
            var tmp = arr[i];
            arr[i] = arr[j];
            i++;
            arr[j] = tmp;
            j--;
        }
    }
    if (left < j) {
        QuickSort(arr, left, j);
    }
    if (i < rigth) {
        QuickSort(arr, i, rigth);
    }
}
var arr = [10, 1, 5, 9, 3, 6, 2, 4, 8, 7, 15, 11, 13, 14, 12, 0, 20, 18, 16, 17, 19];
QuickSort(arr, 0, arr.length - 1);
alert(arr);

C# 实现快速排序算法 :


static void QuickSort(ref List < int > nums, int left, int right) 
{
	if (left < right) 
	{
		int i = left;
		int j = right - 1;
		int middle = nums[(left + right) / 2];
		while (true) 
		{
			while (i < right && nums[i] < middle) { i++; } ; while (j > 0 && nums[j] > middle) 
			{
				j--;
			}
			;
			if (i == j) break;
			nums[i] = nums[i] + nums[j];
			nums[j] = nums[i] - nums[j];
			nums[i] = nums[i] - nums[j];
			if (nums[i] == nums[j]) j--;
		}
		QuickSort(ref nums, left, i);
		QuickSort(ref nums, i + 1, right);
	}
}

转载请注明:清风博客 » 快速排序算法(Quicksort)

]]>
https://www.skyfinder.cc/2016/07/05/quicksort/feed/ 0