作为软件工程科班出身的程序员,数据结构与算法是必修课,可惜自己没有好好学,工作中也用的非常少.决定从今天起,把这门课重头学一遍,里面涉及的数据结构与算法,自己全部写一遍.看看能够坚持多久
开篇从经典的排序算法-选择排序开始:
/*
* 选择排序:首先找出最大的元素,把它移动到a[n-1],然后在剩余下n-1个元素中寻找最大的元素,并把它移动到a[n-2],依次排序.
* 算法复杂度:比较的次数是固定的,1+2+3+...+n-1=(n-1)*n/2,即等于O(n^2).
*
*/
#include <stdio.h>
static void print_arr(int arr[], int arr_size)
{
int i;
if(NULL == arr || arr_size <= 0)
return;
for(i = 0; i < arr_size; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main()
{
int max_index, max_value;
int i, j, arr_size, temp_value;
int arr[] = {4, 3, 7, 6, 5, 0, 9, 1};
arr_size = sizeof(arr)/sizeof(arr[0]);
printf("Before sort: ");
print_arr(arr, arr_size);
/* Selection Sort */
for(i = arr_size - 1; i > 0; i--) {
max_index = i;
max_value = arr[i];
/* Find out the max value and it's index */
for(j = 0; j < i; j++) {
if(arr[j] > arr[max_index]) {
max_index = j;
max_value = arr[j];
}
}
/* Swap it to index i */
if(i != max_index) {
temp_value = arr[i];
arr[i] = arr[max_index];
arr[max_index] = temp_value;
}
}
printf(" After sort: ");
print_arr(arr, arr_size);
return 0;
}
虽然在Linux下编译一个文件gcc一句话就搞定,不过使用Makefile是一个好习惯.
CC=gcc
CCFLAGS=-I/usr/local/include -O2
LDFLAGS=-L/usr/local/lib
TARGET=SelectionSort
OBJS=SelectionSort.o
RM=rm -f
$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(LDFLAGS)
$(OBJS):%.o:%.c
$(CC) -c -g $(CCFLAGS) $< -o $@
clean:
$(RM) $(TARGET) $(OBJS) *~