編程演算法,演算法

來源:互聯網
上載者:User

編程演算法,演算法
快速排序(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;elsereturn 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;}








編程演算法問題

典型的動態規劃背包問題
1 搜尋法:窮舉所有可能的取數情況
2 動態規劃
你是新手吧?由於資料規模很小,直接用搜尋法就行,比動歸好理解,程式也容易寫~~
你找一下背包問題,到處都有詳細解答~~~
zhidao.baidu.com/question/25002746.html
跟這個問題類似 只要稍微改一下題目和代碼就行
改了之後思路如下 幫你換成c語言了 給分啊~~~~

有一個箱子容量為v(正整數,o≤v≤20000),同時有n個物品(o≤n≤30),每個物品有一個體積(正整數)。要求從 n 個物品中,任取若千個裝入箱內,使箱子的剩餘空間為零。(這裡的v就是你的s,這裡的n就是你的n)

l 搜尋方法
void search(int k, int v) {搜尋第k個物品,剩餘空間為v}
{
int i, j;
if(v<best) best=v;
if v-(s[n]-s[k-1])>=best return; // s[n]為前n個物品的重量和
if(k<=n){
if(v>w[k]) search(k+1,v-w[k]); // w[n]為第n個物品的重量
search(k+1,v);
}
}

best為全域變數,表示箱子的剩餘空間的最小值,初始值為設為很大的正數就好
所以 search(n,v)後 best為0則表示有解

2 DP 動態規劃(迭代法)
F[I,j]為前i個物品中選擇若干個放入使其體積正好為j的標誌,為布爾型。
實現:將最佳化問題轉化為判定性問題

F [I][j] =( F [ I-1 ][ j-w[I] ] || F [ I-1 ][ j ] )(w[I]<=j<=v) 邊界:f[0][0]=true;
for(I=1;I<=n;I++)
for(j=w[I];j>=v;j--)
F [I][j] =( F [ I-1 ][ j-w[I] ] || F [ I-1 ][ j ] ) ;

算完之後 F[n][v]為true則有解

3 DP 動態規劃(迭代法最佳化)
最佳化:目前狀態只與前一階段狀態有關,可降至一維。
F[0]=true;
for(I=1;I<=n;I++)
for(j=w[I];j>=v;j--)
F [j] =( F [ j-w[I] ] || F [ j ] );

算完之後 F[v]為true則有解

4 DP 動態規劃(備忘錄演算法)
F為二維數組int F[n][v] 一開始初始化為0
bool dp(int n, int v)
{
if(n==0 && v==0) return 1;
if(n==0 && v!=0) return -1;
if(F[n][v]!=0) return F[n][v];
if(dp(n-1,v-w[n])) return F[n][v]=1;
if(v>=w[n] && dp(n-1,v-w[n])) return return F[n][v]=1;
return F[n][v]=-1;
}......餘下全文>>
 
“演算法” 在編程中什意思?

比如你從b地到a地,有許多條路可以走,任何一條路都可以看作一個演算法。

編程中解決一個問題同樣有很多不同方法,每個方法就是一個演算法。

演算法裡面總有一個最好的,效率最高的,能否做到用效率最高的方法來完成任務,就是一個程式員水平高低的表現之一
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.