2013年6月27日 星期四

Insertion Sort (插入排序法)

(一) Concept:
  將第 i 筆 record 插入到前面 (i-1)筆 已經sorting 之list中,形成 i 筆已經排序好的list ie...i=2 to n 共執行 n-1回合。

(二)example:{88,7,87,9,80,100,800,10,5}

(三)每回合變化

 



程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main (void)
{
    int k;
    int a[] = {88,7,87,9,80,100,800,10,5}; //You change the data what you want to sort
    int array_size = sizeof(a)/sizeof(int);


    printf("start Insertion sort\n");
    InsertionSort(a,array_size);


    printf("Ans is:");
    for(k = 0; k<array_size;k++) //print the result
        printf("%d ",a[k]);


}

void InsertionSort(int data[],int array_size)
{
    int i,j,index,q;
    int counta = 0;
    bool f;

    for(i=1; i< (array_size); i++) //execute the n-1 times
    {
        index = data[i];

        for(j=i;j>0&&data[j-1]>index;j--)//假如後者大於前者則對調
        {
            data[j] = data[j-1];
        }

        data[j] = index;
/*
     // print the every pass
        printf("pass%d ",i);
        for(q=0;q<array_size;q++)
            printf("%d ",data[q]);
        printf("\n");*/


    }

}

2013年6月25日 星期二

Selection sort (選擇排序法)

(一)key idea: 自 i+1 筆 到第 n 筆資料 挑出最小值然後和第i交換

(二)The example:{88,7,87,9,80,100,800,10,5}

(三)每回合變化

 


優點:

適合用在大型記錄之sorting,因為每回和頂多Swap 1次


程式碼

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main (void)
{
    int k;
    int a[] = {88,7,87,9,80,100,800,10,5}; //You change the data what you want to sort
    int array_size = sizeof(a)/sizeof(int);


    printf("start selection sort\n");
    SelectionSort(a,array_size);


    printf("Ans is:");
    for(k = 0; k<array_size;k++) //print the result
        printf("%d ",a[k]);


}

void SelectionSort(int data[],int array_size)
{
    int i,j,minmum,q;
    int counta = 0;
    bool f;

    for(i=0; i< (array_size-1); i++) //execute the n-1 times
    {
        minmum = i;

        for(j=i+1;j<array_size;j++) //找出目前最小值在哪裡        {
            if(data[j]<data[minmum])
                minmum = j;
        }

        if(minmum != i )//如果和之前位置一樣就不用交換
            Swap(&data[i],&data[minmum]);

    /* // print the every pass
        printf("pass%d ",i);
        for(q=0;q<array_size;q++)
            printf("%d ",data[q]);
        printf("\n");*/


    }

}

void Swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}


2013年6月22日 星期六

Bubble Sort 泡沫排序法

1.Time complexity:

worst case: n*n
best cace  :n

2.我一個flag 判斷如果此回合沒有執行 swap則表示sort完畢

code如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main (void)
{
    int k;
    int a[] = {88,7,87,9,80,100,800,300,400}; //You change the data what you want to sort
    int array_size = sizeof(a)/sizeof(int);


    printf("start bubble sort\n");
    BubbleSort(a,array_size);

    for(k = 0; k<array_size;k++) //print the result
        printf("a = %d\n",a[k]);


}

void BubbleSort(int data[],int array_size)
{
    int i,j,temp,q;
    int counta = 0;
    bool f;

    for(i=0; i< (array_size-1); i++) //execute the n-1 times
    {
        f = false;

        for(j=0;j<array_size-1-i;j++)
        {
            if(data[j]>data[j+1])
            {
                Swap(&data[j],&data[j+1]);
                f = true;

            }
            counta++;
        }
        /*
        printf("pass%d ",i);
        for(q=0;q<array_size;q++)
            printf("%d ",data[q]);
        printf("\n");
        */
        if(!f)break;
    }

}

void Swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}



 1.每回合執行如下所示:
 

 2.但如果我拿掉if(!f) break 他會執行完n-1回合
 


這時候就知道演算法的強大了。

call by value VS call by address (傳值VS傳址)

call by value VS call by address


1.call by address



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

int main()
{
    int x =5;
    int y =30;
    Swap(x,y);
    printf("x:%d,y:%d",x,y);
}

void Swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}



the result is :
 



 我要把x , y 兩數交換,但似乎沒有達成我的需求   WHY?

 當我執行到 int x =5 ,系統就會立刻分配記憶體空間給變數使用

所以每個變數都會有一個記憶體位址。


執行swap前



main 中的x
Main 中的y
Swap中的a
Swap中的b
Value
5
30
5
10
Mem_addr
0x7
0x8
0xFF
0xFE


執行swap後



main 中的x
Main 中的y
Swap中的a
Swap中的b
Value
5
30
10
5
Mem_addr
0x7
0x8
0xFF
0xFE



可以看出來他的確有把兩數交換,但他沒有真的把原始的位址傳入
所以call by vaule 只是把value複製給對方。



2.call by address:


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

int main()
{
    int x =5;
    int y =30;
    Swap(&x,&y);
    printf("x:%d,y:%d",x,y);
}

void Swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

the result is:







1.&:取值運算子   ---就是把變數的位址出來

2.然而void.......(int *a, .....) 指標 a 指向 x

執行swap前




main 中的x
Main 中的y
Swap中的a
Swap中的b
Value
5
30
0x7
0x8
Mem_addr
0x7
0x8
0xFF
0xFE



執行swap後



main 中的x
Main 中的y
Swap中的a
Swap中的b
Value
30
5
0x7
0x8
Mem_addr
0x7
0x8
0xFF
0xFE




reference:http://wp.mlab.tw/?p=176