基础算法合集(未完待续...)

桶排序

#pragma mark - 桶排序
    printf("桶排序\n");
    //比较0~10之间的数则创建一个长度11的数组
    int a[11];
    //初始化,全部归0
    for (int i = 0; i < 11; i ++) {
        a[i] = 0;
    }
    //读入5个数,记录每个数出现的次数
    for (int i = 0; i < 5; i++) {
        int t;
        scanf("%d",&t);
        a[t]++;
    }
    //按顺序将角标输出(角标即为排序的数),个数是几就输出几次
    for (int i = 0; i < 11; i ++) {
        for (int j = 1; j <= a[i]; j ++) {
            printf("%d\n",i);
        }
    }

冒泡排序

#pragma mark - 冒泡排序
    printf("冒泡排序\n");
    //比较5个数,创建一个长度为5的数组
    int b[5];
    //读入5个数
    for (int i = 0; i < 5; i ++) {
        scanf("%d",&b[i]);
    }
    //排序
    //5个数只需要冒泡四次
    for (int i = 0; i < 5-1; i ++) {
        for (int j = 0; j < 5-i; j ++) {
            if (b[j]<b[j+1]) {
                //两个数比较,如果后面的数大于前面的数,则两个数交换(冒泡)
                int t;
                t = b[j];
                b[j] = b[j+1];
                b[j+1] = t;
            }
        }
    }
    //按顺序输出
    for (int i = 0; i < 5; i ++) {
        printf("%d\n",b[i]);
    }

快速排序

#pragma mark - 快速排序
//定义一个全局数组用于排序10个数
int a[10];

//快速排序函数
void quicksort(int left,int right){
    if (right<left) {
        return;
    }
    //让i,j分别等于左右两边的下标,让最左的数作为基数
    int i = left,j = right,temp = a[left],t;
    /*
     1.先j向左移动,直到找到比temp小的数,然后让i向右移动,直到找到比temp大的数,然后将这两个数交换位置。由于基数为最左端的数,所以一定要让j先向左移动
     2.继续移动i,j,重复步骤1,直到i,j相等,将基数放于i位置
     3.从基数处分为两组,分别执行步骤1、2、3
     */
    while (i != j) {
        //先让j向左移动
        while (a[j]>=temp && i<j) {
            j --;
        }
        //再让i向右移动
        while (a[i]<=temp && i<j) {
            i ++;
        }
        //找到比基数小的数与比基数大的数,交换
        if (i < j) {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    //i,j相等,将基数与i位置的数交换
    a[left] = a[i];
    a[i] = temp;
    //分成两组,继续操作
    quicksort(left, i-1);
    quicksort(i+1, right);
}

int main(int argc, const char * argv[]) {
    
    //读入十个数
    for (int i = 0; i < 10; i ++) {
        scanf("%d",&a[i]);
    }
    
    //执行排序函数
    quicksort(0, 9);
    
    for (int i = 0; i < 10; i ++) {
        printf("%d\n",a[i]);
    }
    
    return 0;
}

队列与出入队

#pragma mark - 队列与出入队列
//定义一个队列
struct queue {
    int data[100];  //队列主体,存储数据
    int head;  //队首
    int tail;  //队尾
};

int main(int argc, const char * argv[]) {
    
    struct queue q;  //初始化一个队列
    //初始化
    q.head = 0;
    q.tail = 0;
    //输入9个数
    for (int i = 0; i < 9; i ++) {
        scanf("%d",&q.data[q.tail]);
        q.tail ++;
    }
    //空队列时停止循环
    while (q.head < q.tail) {
        //打印队首,并出队
        printf("%d\n",q.data[q.head]);
        q.head ++;
        //将新队首添加到队尾
        q.data[q.tail] = q.data[q.head];
        q.tail ++;
        //再将队首出队
        q.head ++;
    }
    
    return 0;
}

判断回文(栈操作)

#pragma mark - 判断字符串是否为回文
    char a[100], s[100];
    long len, next, top, mid;
    //输入一串字符
    gets(a);
    len = strlen(a);
    //找出中点
    mid = len/2-1;
    //初始化栈
    top = 0;
    //将中点前的字符入栈
    for (int i = 0; i<= mid; i ++) {
        top ++;
        s[top] = a[i];
    }
    //判断奇偶,来确定开始对比的位置
    if (len%2 == 0) {
        next = mid + 1;
    }
    else {
        next = mid + 2;
    }
    //对比,对比成功一位出栈一位
    for (long i = next; i < len; i ++) {
        if (s[top] != a[i]) {
            break;
        }
        //出栈操作
        top --;
    }
    
    if (top == 0) {
        printf("y\n");
    }
    else {
        printf("n\n");
    }

链表-插入一个数据

#pragma mark - 链表操作-插入一个数据
//定义链表的节点
struct node {
    int data;  //节点的数据
    struct node *next;  //指向下一个节点的指针
};

int main(int argc, const char * argv[]) {
    
    struct node *head, *p, *q, *t;
    //读入5个数
    int a;
    head = NULL;
    q = NULL;
    for (int i = 0; i < 5; i ++) {
        scanf("%d",&a);
        //创建一个节点
        p = malloc(sizeof(struct node));
        p->data = a;
        p->next = NULL;
        if (head == NULL) {
            //如果头节点的指针为空,说明这是一个空链表,将新创建的节点作为头节点
            head = p;
        }
        else {
            //头节点不为空,则说明这不是一个空链表,则将新创建的节点作为上一个节点的下一个节点
            q->next = p;
        }
        //将新创建的节点作为上一个节点,进行下一次循环
        q = p;
    }
    //插入
    scanf("%d",&a);
    //循环遍历,直到找到一个比输入的数大的节点,插入到它前面
    t = head;
    while (t != NULL) {
        if (t->next->data > a) {
            //创建一个新的节点
            p = malloc(sizeof(struct node));
            p->data = a;
            //插入这个节点
            p->next = t->next;
            t->next = p;
            break;
        }
        t = t->next;
    }
    //遍历
    t = head;
    while (t != NULL) {
        printf("%d\n",t->data);
        t = t->next;
    }
    
    return 0;
}

“模拟链表” 的实现与操作(插入数据)

#pragma mark - “模拟链表”的实现与操作(插入一个数)
    /*
     模拟链表:有两个整形数组,第一个整型数组 data 是用来存放序列中具体数字的,另外一个整型 数组 right 是用来存放当前序列中每一个元素右边的元素在数组 data 中位置的。例如 right[1] 的值为 2,就表示当前序列中 1 号元素右边的元素存放在 data[2]中;如果是 0,例如 right[9] 的值为 0,就表示当前序列中 9 号元素的右边没有元素。
     */
    //定义两个数组
    int data[100], right[100];
    int n, len, t;
    //读入几个数
    scanf("%d",&n);
    for (int i = 1; i <= n; i ++) {
        scanf("%d",&data[i]);
    }
    //初始化right数组
    len = n;
    for (int i = 1; i <= n; i ++) {
        if (i != len) {
            //如果“模拟链表”中第 i 位不是最后一位,则在“模拟链表”中第 i 位的右边一位在 data 中的位置为 i+1
            right[i] = i+1;
        }
        else {
            //i 是最后一位,则“模拟链表”中第 i 位的右边一位在
            right[i] = 0;
        }
    }
    //插入一个数据,直接将数据放在 data 的最后
    len ++;
    scanf("%d",&data[len]);
    //遍历链表,直到找到一个比输入数大的数
    t = 1;
    while (t != 0) {
        //如果链表中 t 位置的下一位的值大于刚刚输入的数,则进行插入操作
        if (data[right[t]] > data[len]) {
            right[len] = right[t];
            right[t] = len;
            break;
        }
        //t 等于链表中 t 位置的下一位
        t = right[t];
    }
    
    //遍历
    t = 1;
    while (t != 0) {
        printf("%d\n",data[t]);
        t = right[t];
    }

广度优先搜索与深度优先搜索

//以一个 10 * 10 的二维矩阵为例,搜索矩阵中一个点周围的大于0的点个数

/**
 广度优先搜索
 */

//表示一个点的结构体
struct note {
    int x;
    int y;
};

int main(int argc, const char * argv[]) {
    struct note que[101];  //表示存储点的队列,在 10*10 的二维矩阵中最多 101 个点
    int head,tail;  //指示队列的队首与队尾
    int a[11][11];  //用来表示二维矩阵
    int book[11][11] = {0};  //用来标识已经入队的点,例:(2,3) 已经在队列中,则 book[2][3] = 1
    int i,j,sum,startx,starty,tx,ty;
    
    //定义一个方向数组,用来表示向上下左右搜索
    int next[4][2] = {
        {0,1},   //向右
        {1,0},   //向下
        {0,-1},  //向左
        {-1,0}   //向上
    };
    
    //设置开始搜索的点
    startx = 6;
    starty = 8;
    
    //读入一个二维矩阵
    for (i = 1; i <= 10; i ++)
        for (j = 1; j <= 10; j ++)
            scanf("%d",&a[i][j]);
    
    //初始化队列
    head = 1;
    tail = 1;
    //将开始点添加进队列
    que[tail].x = startx;
    que[tail].y = starty;
    tail ++;
    book[startx][starty] = 1;
    sum = 1;
    
    //队列不为空就循环
    while (head < tail) {
        //遍历四个方向
        for (i = 0; i < 4; i ++) {
            //计算下一步的坐标
            tx = que[head].x + next[i][0];
            ty = que[head].y + next[i][1];
            //判断是否越界
            if (tx<1 || tx>10 || ty>10 || ty<1)
                continue;
            //判断是否已经走过这个点且符合条件(这个矩阵上的点的值大于0)
            if (a[tx][ty]>0 && book[tx][ty]==0) {
                sum ++;
                book[tx][ty] = 1;  //标记这个点已经走过
                
                //入队
                que[tail].x = tx;
                que[tail].y = ty;
                tail ++;
                
            }
        }
        //这个点的四个方向都遍历完了,转向下一个点,继续遍历这个点的四个方向(广度优先)
        head ++;
    }
    
    //输出符合条件的点的总和
    printf("%d\n",sum);
    
    return 0;
}


/**
 深度优先搜索
 */

int a[11][11];  //用来表示二维矩阵
int book[11][11] = {0};  //用来标识已经入队的点,例:(2,3) 已经在队列中,则 book[2][3] = 1
int sum;

void dfs(int x, int y){
    
    //定义一个方向数组,用来表示向上下左右搜索
    int next[4][2] = {
        {0,1},   //向右
        {1,0},   //向下
        {0,-1},  //向左
        {-1,0}   //向上
    };
    int i,tx,ty;
    
    //遍历四个方向
    for (i = 0; i < 4; i ++) {
        //计算下一个点坐标
        tx = x + next[i][0];
        ty = y + next[i][1];
        //判断是否越界
        if (tx<1 || tx>10 || ty>10 || ty<1)
            continue;
        //判断是否已经走过这个点且符合条件(这个矩阵上的点的值大于0)
        if (a[tx][ty]>0 && book[tx][ty]==0) {
            sum ++;
            book[tx][ty] = 1;  //这个点已经走过
            dfs(tx, ty);  //继续下一个点(深度优先)
        }
    }
    
    //已经到了一个方向的终点,返回上一个点继续另一个方向(深度优先)
    return;
    
}

int main(int argc, const char * argv[]) {
    
    int i,j,startx,starty;
    
    //设置开始点
    startx = 6;
    starty = 8;
    
    //读入一个二维矩阵
    for (i = 1; i <= 10; i ++)
        for (j = 1; j <= 10; j ++)
            scanf("%d",&a[i][j]);
    
    //记录开始位置已经读取过
    book[startx][starty] = 1;
    sum = 1;
    
    //开始搜索
    dfs(startx, starty);
    
    printf("%d\n",sum);
    
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容