zoukankan      html  css  js  c++  java
  • C之算法

       1° 选择排序算法

       核心思路如下图:

       以字符串排序进行说明

    #include <stdio.h>
    #include <string.h>
    #define SIZE 81
    #define LIM 20
    #define HALT " "
    void stsrt(char *strings[], int num);
    
    int main(void)
    {
        char input[LIM][SIZE];
        char *ptstr[LIM];
        int ct = 0;
        int k;
    
        printf("Input up %d lines, and I will sort them.
    ", LIM);
        printf("To stop, press the Enter key at a line's start.
    ");
        while(ct < LIM && gets(input[ct]) != NULL && input[ct][0] != '')
        {
            ptstr[ct] = input[ct];
            ct++;
        }
        stsrt(ptstr, ct);
        puts("
    Here's the sorted list: 
    ");
        for(k = 0; k < ct; k++)
            puts(ptstr[k]);
    
        return 0;
    }
    void stsrt(char *strings[], int num)
    {
        char *temp;
        int top, seek;
    
        for(top = 0; top < num - 1; top++)
            for(seek = top + 1; seek < num; seek++)
                if(strcmp(strings[top], strings[seek]) > 0)
                {
                    temp = strings[top];
                    strings[top] = strings[seek];
                    strings[seek] = temp;
                }
    }
    View Code

       以int数组排序进行说明(以C语言为例)

    #include <stdio.h>
    
    void sort(int a[], int len);
    int main(void)
    {
        int number[] = {2, 4, 7, 11, 789, 16, 89, 24, 27, 32, 36, 40, 46};
        int len = sizeof(number) / sizeof(number[0]);
        sort(number, len);
        for(int i = 0; i <len; i++)
            printf("%d ", number[i]);
        return 0;
    }
    void sort(int a[], int len)
    {
        int temp;
        for(int i = 0; i < len - 1; i++)
        {
            for(int j = i + 1; j < len; j++)
                if(a[i] > a[j]) // 小——>大      若a[i] < a[j]; 大——>小
                {
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
        }
    }
    View Code

       (以JAVA语言为例)

    public class ArrayDemo {
    
        public static void main(String[] args) {
           int age[] = {31, 30, 18, 17, 8, 9, 1, 39};
           sort(age);
           print(age);
        }
        
        public static void print(int temp[]) {
            for(int i = 0; i < temp.length; i++)
                System.out.print(temp[i] + " ");
        }
        
        public static void sort(int temp[]) {
            for(int i = 0, t = 0; i < temp.length - 1; i++)
                for(int j = i + 1; j < temp.length; j++)
                    if(temp[j] < temp[i]) {
                        t = temp[j];
                        temp[j] = temp[i];
                        temp[i] = t;
                    }
        }
    }
    View Code

       核心思想:(查找和放置)选择剩余最大值的一个办法就是比较剩余数组的第一和第二个元素。如果第二个元素大,就交换这两个数据。想在比较第一个和第三个元素。如果第三个大,就交换这两个数据。每一次交换都把大的元素移到上面。继续这种方法,直到比较第一个和最后一个元素。完成以后,最大的数就在剩余数组的第一个元素中。此时第一个元素已经排好了序,但是数组中的其他元素还很混乱。

       2° 冒泡排序算法

       核心思路如下图:

       (以JAVA语言为例)   

    public class OtherDemo {
    
        public static void main(String[] args) {
            int[] arr = new int[] { 3, 1, 6, 5, 4 };
            //排序前
            print(arr);
            bubbleSort(arr);
            //排序后
            print(arr);
        }
        
        public static void print(int temp[]) {
            for (int i = 0; i < temp.length; i++) {
                if (i != temp.length - 1)
                    System.out.print(temp[i] + ", ");
                else
                    System.out.println(temp[i]);
            }
    
        }
        
        //冒泡排序
        public static void bubbleSort(int temp[]) {
            for (int i = 0; i < temp.length - 1; i++)
                for (int j = 0; j < temp.length - i - 1; j++) //-x:让每一次比较的元素减少,-1:避免下标越界
                    if (temp[j] > temp[j+1]) {
                        int t = temp[j];
                        temp[j] = temp[j+1];
                        temp[j+1] = t;
                    }
        }
    
    }
    View Code

       3° 二分搜索算法

       核心思路如下图:

      

       (以C语言为例)

    #include <stdio.h>
    
    int search(int key, int a[], int len);
    int main(void)
    {
        int k = 36;
        int number[] = {2, 4, 7, 11, 13, 16, 21, 24, 27, 32, 36, 40, 46};
        int r = search(k, number, sizeof(number) / sizeof(number[0]));
        if(r > -1)
            printf("%d
    ", number[r]);
        return 0;
    }
    // 二分搜索(排好序的数组)
    int search(int key, int a[], int len)
    {
        int ret = -1;
        int left = 0;
        int right = len - 1;
    
        while(right >= left)   // 条件应该是right >= left,而不应是right > left
        {
            int mid = (left + right) / 2;
            if(a[mid] == key)
            {
                ret = mid;
                break;
            }
            else if(a[mid] > key)
                right = mid - 1;
            else
                left = mid + 1;
        }
        return ret;
    }
    View Code

        (以JAVA语言为例)

       4° 一个统计单词数的小程序

    #include <stdio.h>
    #include <stdbool.h>
    #include <ctype.h>
    // 统计单词数的函数
    int count_word(char * str);
    
    int main(void)
    {
        char str[101];
    
        puts("请输入一个字符串:");
        gets(str);
        printf("统计的单词数是:%d", count_word(str));
    
        return 0;
    }
    int count_word(char * str)
    {
        bool inword = false;
        int n_words = 0;
    
        while(*str)
        {
            if(!isspace(*str) && !inword)
            {
                inword = true;
                n_words++;
            }
            if(isspace(*str) && inword)
                inword = false;
            str++;
        }
        return n_words;
    }
    View Code
  • 相关阅读:
    第150天:网页中插入百度地图方法(需要密钥)
    第149天:javascript中this的指向详解
    第148天:js+rem动态计算font-size的大小,适配各种手机设备
    第147天:web前端开发中的各种居中总结
    第146天:移动H5前端性能优化
    第145天:jQuery.touchSlider触屏满屏左右滚动幻灯片
    第144天:PS切图方法总结
    第143天:渐进增强和优雅降级之间的不同
    第142天:Size Marks下载安装和使用方法
    第141天:前端开发中浏览器兼容性问题总结(二)
  • 原文地址:https://www.cnblogs.com/yerenyuan/p/5068868.html
Copyright © 2011-2022 走看看