编程算法 - 快速排序(QuickSort)和二分查找(BinarySearch)

快速排序(QuickSort)和二分查找(BinarySearch)

本文地址: http://blog.csdn.net/caroline_wendy

快速排序和二分查找的定义, 网上书上都有, 本文主要是讲解如何写出这两个经典算法.

程序员必须掌握的两种算法, 使用任何语言, 使用纸都是必须的.

快速排序(C):

/*
 * main.cpp
 *
 *  Created on: 2014年9月10日
 *      Author: Spike
 */

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <exception>

int RandomInRange(int start, int end) {
	int res = rand()%(end-start+1) + start;
	return res;
}

void Swap(int* num1, int* num2) {
	int tmp = *num1;
	*num1 = *num2;
	*num2 = tmp;
}

int Partition(int data[], int length, int start, int end) {
	if (data == NULL || length <= 0 || start > end || start < 0 || end >= length) {
		return -1;
	}

	int index = RandomInRange(start, end);
	Swap(&data[index], &data[end]);
	int small = start-1;
	for (index = start; index < end; ++index) {
		if (data[index] < data[end]) {
			small++;
			if (small != index)
				Swap(&data[index], &data[small]);
		}
	}
	small++;
	Swap(&data[small], &data[end]);
	return small;
}

void QuickSort(int data[], int length, int start, int end) {
	if (start == end)
		return;
	int index = Partition(data, length, start, end);
	if (index > start)
		QuickSort(data, length, start, index-1);
	if (index < end)
		QuickSort(data, length, index+1, end);
}

int main(void) {
	int data[] = {1, 4, 5, 2, 3, 7, 8, 6};
	int length = 8;
	QuickSort(data, length, 0, length-1);
	for (int i=0; i<length; ++i) {
		printf("%d ", data[i]);
	}
	printf("\n");
	return 0;
}

二分查找(C):

/*
 * main.cpp
 *
 *  Created on: 2014年9月10日
 *      Author: Spike
 */

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <exception>

int BinarySearch(int data[], int length, int value) {
	int left = 0;
	int right = length-1;
	while (left <= right) {
		int middle = left + (right-left);
		if (data[middle] > value)
			right = middle - 1;
		else if (data[middle] < value)
			left = middle + 1;
		else
			return middle;
	}
	return -1;
}

int main(void) {
	int data[] = {1, 2, 3, 4, 5, 6, 7, 8};
	int length = 8;

	printf("%d ", BinarySearch(data, length, 5));

	printf("\n");
	return 0;
}

时间: 2024-10-29 04:27:21

编程算法 - 快速排序(QuickSort)和二分查找(BinarySearch)的相关文章

编程算法 - 快速排序算法 代码(C)

快速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的快速排序算法, 作为一个编程者, 任何时候都要完整的手写. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> int RandomInRange(int min,

十大基础实用算法之归并排序和二分查找

归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 算法步骤: 1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置 3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 4. 重复步骤3直到某一指针达到序列尾 5. 将另一序列剩下的所有元素直接复制到合并序列尾 用分治策略解决问题分为三步:分解

算法复习笔记:二分查找

在计算机科学中,折半搜索(英语:half-interval search),也称二分查找算法(binary search).二分搜索法.二分搜索.二分探索,是一种在有序数组中查找某一特定元素的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半. 实现: int bin

List&lt;T&gt;线性查找和二分查找BinarySearch效率分析

今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式. 线性查找:Contains,Find,IndexOf都是线性查找. 二分查找:BinarySearch,因为二分查找必须是对有序数组才有效,所以查找前要调用List的Sort方法. 结论:如果List项的个数比较小,用线性查找要略快于二分查找,项的个数越多二分算法优势越明显.可根据实际情况选用适合的查找方式. 测试结果: 测试代码: private void button1_Cli

算法导论 2.3-5 二分查找

1.二分查找(Binary Search) 二分查找又称折半查找,它是一种效率较高的查找方法.    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且表的存储结构为顺序结构.不妨设有序表是递增有序的. 2.二分查找的基本思想 二分查找算法思想: (1)首先确定该区间的中点位置: mid = ( left + right ) / 2; (2)然后将待查的K值与R[mid].key比较,若相等,则查找成功并返回此位置:否则须确定新的查找区间,继续二分查找,具体方法如下: ①若R[mid].

js基本算法:冒泡排序,二分查找

知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡排序 解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较. 1 function sort(elements){ 2 for(v

算法实现回顾1——二分查找

前话: 为什么写这个系列?算法的精髓除了在于算法的一个设计,更在于算法的一个好的设计.前者可能需求一个好的算法工程师,而后者则需求一个优秀的程序员.很多时候我们往往只希望去了解一种设计思路,但是对于程序员,一种优良的实现是非常重要的.实现的细节才决定成败.毕竟程序员面对和输出的都是程序,而不是思路. 引用: 你真的会二分查找吗?http://blog.csdn.net/int64ago/article/details/7425727二分查找,你真的会吗?http://www.ahathinkin

在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历

独白: 利用算法进行查找指定元素,最近学习二分查找和二叉树遍历.二分查找前提是在有序中进行查找,二叉树引入了树的概念.树的概念其中有许多小知识点,也是一种新的数据结构.还是之前的感悟,需了解其本质才会写出更好的算法. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用

经典算法系列之:二分查找

1.前言 算法,在计算机中的地位,就相当于人类大脑的决策中枢系统,哪怕最简单的算法,其精妙的思维方式,都可以让人开启一扇新的视窗. 算法,它不仅仅只是狭义的用来解决计算机科学领域的问题,更是一种"思维方式".算法思维,是一种深度思考和创造的过程. 算法,只有真正理解了,而不只是所谓的知道,并将应用到生活.工作.学习等各个方面,它将一定使人受益终生. 2.原理推导 二分查找,前提是在排好序的基础上,每次查找,将数据集合分成两个部分,取中间索引数值与被查找的数值比较,逐次缩小查找范围,直到