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

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


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


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

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


快速排序(C):

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * main.cpp 
  3.  * 
  4.  *  Created on: 2014年9月10日 
  5.  *      Author: Spike 
  6.  */  
  7.   
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10. #include <iostream>  
  11. #include <exception>  
  12.   
  13. int RandomInRange(int start, int end) {  
  14.     int res = rand()%(end-start+1) + start;  
  15.     return res;  
  16. }  
  17.   
  18. void Swap(int* num1, int* num2) {  
  19.     int tmp = *num1;  
  20.     *num1 = *num2;  
  21.     *num2 = tmp;  
  22. }  
  23.   
  24. int Partition(int data[], int length, int start, int end) {  
  25.     if (data == NULL || length <= 0 || start > end || start < 0 || end >= length) {  
  26.         return -1;  
  27.     }  
  28.   
  29.     int index = RandomInRange(start, end);  
  30.     Swap(&data[index], &data[end]);  
  31.     int small = start-1;  
  32.     for (index = start; index < end; ++index) {  
  33.         if (data[index] < data[end]) {  
  34.             small++;  
  35.             if (small != index)  
  36.                 Swap(&data[index], &data[small]);  
  37.         }  
  38.     }  
  39.     small++;  
  40.     Swap(&data[small], &data[end]);  
  41.     return small;  
  42. }  
  43.   
  44. void QuickSort(int data[], int length, int start, int end) {  
  45.     if (start == end)  
  46.         return;  
  47.     int index = Partition(data, length, start, end);  
  48.     if (index > start)  
  49.         QuickSort(data, length, start, index-1);  
  50.     if (index < end)  
  51.         QuickSort(data, length, index+1, end);  
  52. }  
  53.   
  54. int main(void) {  
  55.     int data[] = {1, 4, 5, 2, 3, 7, 8, 6};  
  56.     int length = 8;  
  57.     QuickSort(data, length, 0, length-1);  
  58.     for (int i=0; i<length; ++i) {  
  59.         printf("%d ", data[i]);  
  60.     }  
  61.     printf("\n");  
  62.     return 0;  
  63. }  

二分查找(C):

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * main.cpp 
  3.  * 
  4.  *  Created on: 2014年9月10日 
  5.  *      Author: Spike 
  6.  */  
  7.   
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10. #include <iostream>  
  11. #include <exception>  
  12.   
  13. int BinarySearch(int data[], int length, int value) {  
  14.     int left = 0;  
  15.     int right = length-1;  
  16.     while (left <= right) {  
  17.         int middle = left + ((right-left)>>1);  
  18.         if (data[middle] > value)  
  19.             right = middle - 1;  
  20.         else if (data[middle] < value)  
  21.             left = middle + 1;  
  22.         else  
  23.             return middle;  
  24.     }  
  25.     return -1;  
  26. }  
  27.   
  28. int main(void) {  
  29.     int data[] = {1, 2, 3, 4, 5, 6, 7, 8};  
  30.     int length = 8;  
  31.   
  32.     printf("%d ", BinarySearch(data, length, 5));  
  33.   
  34.     printf("\n");  
  35.     return 0;  
  36. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值