编程算法 - 快速排序(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)>>1);
		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;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElminsterAumar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值