pretty code

2009年12月9日 星期三

合併排序

合併就是把兩堆已經排序好的資料
按大小重新排列成一堆

//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
#define  LEFT      'L'
#define  RIGHT     'R'
//---------------------------------------------------------------------------
int      g_icount = 1;
//---------------------------------------------------------------------------
void mergeSort(int *list, int *tmp, char type, int left, int right)
{
    if(left >= right) return;
   
    int middle = (left+right)/2;
   
    mergeSort(list, tmp, LEFT,  left,     middle);
    mergeSort(list, tmp, RIGHT, middle+1, right);
   
    int indexL = left;
    int indexR = middle+1;
    int index  = 0;
   
    while(indexL <= middle && indexR <= right)
    {
        if(list[indexL] <= list[indexR])
        {
            tmp[index++] = list[indexL++];
        }
        else
        {
            tmp[index++] = list[indexR++];
        }
    }
   
    //Copy from Left
    for(int i = indexL; i <= middle; i++)
        tmp[index++] = list[i];
    //Copy from Right
    for(int i = indexR; i <= right; i++)
        tmp[index++] = list[i];
   
    //Debug
    printf("[%02d] %c ", g_icount++, type);
    for(int i = 0; i < index; i++)
        printf("%d ", tmp[i]);
    printf("\n");
   
    //Copy to list
    int j;
    for(int i = left, j = 0; i <= right; i++, j++)
        list[i] = tmp[j];   
}
//---------------------------------------------------------------------------
int main(void)
{
    int list[] = {12,15,49,22,15,10};
   
    int max = sizeof(list)/sizeof(int);
   
    int tmp[6];   
   
    mergeSort(list, tmp, LEFT, 0, max-1);
   
    printf("\nResult: ");
    for(int i = 0; i < max; i++)
        printf("%d ", list[i]);
    printf("\n\n");
       
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
 

2009年12月7日 星期一

計概爛題目解決之道

set CC=D:\Dev-Cpp\bin\gcc.exe
set EDITOR="C:\Program Files\IDM Computer Solutions\UltraEdit-32\uedit32.exe"

%CC% test.c -E > test.out
%EDITOR% test.out


如果可以把檔案再 parse 過會更好,只要 main 以後的。

好歹我也寫了五年的程式,計概的程式會不會太爛了點?
我連 preprocessor 都動用了... XD

分頁替換法

搞了好久
終於搞懂恐龍書說什麼
原來是它排版沒排好的關係


2009年11月30日 星期一

計算機概要趨勢預測


牌品好,牌就會好

牌品好,牌就會好

越爛的牌越要用心去打
越打就會越順
越順運氣就會越好

這句話是我最喜歡的華仔
在電影嚦咕嚦咕新年財說的話

其實套用在讀書上面也會通

越難的科目越要用心去看
看久了就會順
順了自然就沒有問題了 ... XD

讀書真的需要技巧
作筆記也是
(努力只是基本的)

可惜之前考試時還沒到達這個境界
不然我會更有把握

之前的我還以為進入了嫁衣神功‧如意之境
想想還真是有些天真

總有一天
我一定會跟明玉神功第九層一決高下

快速排序

//---------------------------------------------------------------------------
#define  SWAP(x,y) {int t; t = x; x = y; y = t;}
//---------------------------------------------------------------------------
#define  LEFT      'L'
#define  RIGHT     'R'
//---------------------------------------------------------------------------
int      g_icount = 1;
//---------------------------------------------------------------------------
void quickSort(char type, int preindex, int list[], int left, int right)
{
    int i     = left;
    int j     = right;
    int pivot = left;
    int max   = right;
    int min   = left;
   
    //current index
    int index = g_icount;
   
    //debug
    printf("(%02d) %02d %c  ", g_icount++, preindex, type);
   
    for(int i = left; i <= right; i++)
        printf("%02d ", list[i]);
    printf("\n");
   
    if(left >= right) return;
   
    while(i < j)
    {
        while(list[i] <= list[pivot] && i < max) i++;
       
        while(list[j] > list[pivot] && j > min) j--;
       
        if(i < j)
        {
            //i,j change
            SWAP(list[i], list[j]);
        }           
    }

    //pivot, j change
    SWAP(list[j], list[pivot]);
   
    quickSort(LEFT,  index, list, left, j-1);
    quickSort(RIGHT, index, list, j+1, right);
}

2009年11月29日 星期日

資料庫需補充資料

1. 系統目錄、資料字典
2. 自然合併、日合併(希爾他)
3. 先導圖
4. 時間戳記