C语言基础算法

 

复制代码
//
//  main.c
//  选择排序
//
//  Created by king on 15/10/20.
//  Copyright © 2015年 king. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 定义数组
    int array[5] = {23, 56, 36, 89, 50};
    
    // 计算数组长度
    int length = sizeof(array) / sizeof(array[0]);
    
    // 遍历数组(无序)
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    printf("----------------------\n");
    
    // length - 1  防止越界 ,因为最后一个不需要在比较了
    for (int i = 0; i < length - 1; i ++) {
        
        for (int j = i + 1;  j < length; j++) {
            
            if (array[i] > array[j]) {
                
                // 定义临时变量,用于交换变量
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
                
            }
        }
    }
    
    // 遍历数组(排序后)
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    return 0;
}
复制代码

复制代码
//
//  main.c
//  冒泡排序
//
//  Created by king on 15/10/20.
//  Copyright © 2015年 king. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 定义数组
    int array[5] = {23, 56, 36, 89, 50};
    
    // 计算数组长度
    int length = sizeof(array) / sizeof(array[0]);
    
    // 遍历数组(无序)
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    printf("----------------------\n");
    
    for (int i = 0; i < length - 1; i++) {
        
        for (int j = 0; j < length - 1 -i; j++) {
            // 两两比较
            if (array[j] > array[j+1]) {
                // 交换变量
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
    
    // 遍历数组(排序后)
    for (int i = 0; i < length; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    return 0;
}
复制代码

复制代码
//
//  main.c
//  折半查找
//
//  Created by king on 15/10/20.
//  Copyright © 2015年 king. All rights reserved.
//

#include <stdio.h>
int findKey(int array[], int length, int key);

int main(int argc, const char * argv[]) {
  
    // 定义数组
    int nums[10] = {15, 20, 35, 40, 46, 56, 59, 68, 76, 90};
    // 数组长度
    int length = sizeof(nums) / sizeof(nums[0]);
    // 需要查找的key
    int key = 46;
    
    printf("%d == nums[%d]\n", key, findKey(nums, length, key));
    return 0;
}

#pragma mark --查找key
int findKey(int array[], int length, int key)
{
    int min, max, mid;
    min = 0;
    max = length - 1;
    
    // 只要还在我们的范围内就需要查找
    while (min <= max) {
        // 计算中间值
        mid = (min  + max) / 2;
        if (key > array[mid]) {
            min = mid + 1;
        }else if (key < array[mid])
        {
            max = mid - 1;
        }else
        {
            return mid;
        }
        
    }
    return -1; // 找不到就返回 -1
}
复制代码

进制查表法

复制代码
//
//  main.c
//  进制查表法
//
//  Created by king on 15/10/20.
//  Copyright © 2015年 king. All rights reserved.
//

//  十进制转十六进制 八进制 二进制

#include <stdio.h>
void total(int value, int base, int offset);
void ptintBinary(int num);
void printfOct(int num);
void printfHex(int num);

int main(int argc, const char * argv[]) {
    
    printf("十六进制:"),printfHex(101010);
    printf("八进制:"),printfOct(10545);
    printf("二进制:"),ptintBinary(9546);
    
    return 0;
}

#pragma mark -- 转十六进制
void printfHex(int num)
{
    total(num, 15, 4);
}

#pragma mark -- 转八进制
void printfOct(int num)
{
    total(num, 7, 3);
}
#pragma mark -- 转二进制
void ptintBinary(int num)
{
    total(num, 1, 1);
}

/**
 *  转换所有的进制
 *
 *  @param value  需要转换的数值
 *  @param base   需要&上的数
 *  @param offset 需要右移的位数
 */
void total(int value, int base, int offset)
{
    // 1.定义一个数组, 用于保存十六进制中所有的取值
    char charValues[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    // 2.定义一个数组, 用于保存查询后的结果
    char results[32] = {'0'};
    // 3.定义一个变量, 用于记录当前需要存储到查询结果数组的索引
    int pos = sizeof(results)/ sizeof(results[0]);
    
    while (value != 0) {
        // 1.取出1位的值
        int res = value & base;// 1 7 15
        // 2.利用取出来得值到表中查询对应的结果
        char c = charValues[res];
        // 3.存储查询的结果
        results[--pos] = c;
        // 4.移除二进制被取过的1位
        value = value >> offset;// 1 3 4
    }
    
    // 4.打印结果
    for (int i = pos; i < 32; i++) {
        printf("%c", results[i]);
    }
    printf("\n");
    
}
复制代码

 

 
分类: C语言
posted @ 2015-10-21 10:58  J开拓K  阅读(169)  评论(0编辑  收藏  举报