• 排序 折半,冒泡 快排


    折半插入排序:

    /***********************************************
              折半插入排序
    ***********************************************/
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<ctype.h>
    #include<stdbool.h>
    #include<stdlib.h>
    void BinaryInsertSort(int* a, int n)
    {
        int i, j, k, low, high, m;
        for(i = 1; i < n; i++)
        {
            low = 0;
            high = i - 1;
            while(low <= high)
            {
                m = (low + high) / 2;
                if(a[m] > a[i]) {
                    high = m - 1;
                }
                else {
                    low = m + 1;
                }
            }
            if(j != i - 1)
            {
                int temp = a[i];
                for(k = i - 1; k >= high + 1; k--) {
                    a[k + 1] = a[k];
                }
                a[k + 1] = temp;
            }
        }
    }
    
    void printArray(int* a, int n)
    {
        for(int i = 0; i < n; i++)
        {
            printf("%d ", a[i]);
        }
        printf("
    ");
    }
    
    int main()
    {
        int a[7] = {5, 2, 1, 8, 10, 23, 22};
        BinaryInsertSort(a, 7);
        printArray(a, 7);
        return 0;
    }

    折半查找算法:

    /***********************************
    
              折半查找算法
    
    ***********************************/
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<ctype.h>
    #include<stdbool.h>
    #define COMPARE(x,y) (((x) < (y)) ? -1 : ((x) == (y)) ? 0 : 1)
    /* 非递归代码 */
    int binsearch(int list[], int searchchnumm, int left, int right)
    {
        int middle;
        while(left <= right) {
            middle = (right + left) / 2;
            switch(COMPARE(list[middle], searchchnumm)) {
                case -1:
                    left = middle + 1;
                    break;
                case 0:
                    return middle;
                    break;
                case 1:
                    right = middle - 1;
                    break;
                default:
                    break;
            }
        }
        return -1;
    }
    /* 递归代码 */
    int binsearch(int list[], int searchchnumm, int left, int right)
    {
        int middle;
        if(left <= right) {
            middle = (left + right) / 2;
            switch(COMPARE(list[middle], searchchnumm)) {
                case -1:
                    return binsearch(list, searchchnumm, middle + 1, right);
                    break;
                case 0:
                    return middle;
                    break;
                case 1:
                    return binsearch(list, searchchnumm, left, middle - 1);
                    break;
                default:
                    break;
            }
        }
        return -1;
    }
    int main()
    {
        int list[] = {2, 4, 5, 1, -3, 6, 8, 10, 55, 23};
        int searchnum = 5;
        int length;
        length = sizeof(list) / sizeof(int);
        printf("%d
    ", length);
        printf("%d
    ", binsearch(list, searchnum, 0, length));
        return 0;
    }

    冒泡算法:

    /***********************************************
    
              冒泡排序
    
    ***********************************************/
    #include <stdio.h>
    void bubbleSort(int arr[], int count)
    {
        int i = count, j;
        int temp;
        while(i > 0)
        {
            for(j = 0; j < i - 1; j++)
            {
                if(arr[j] > arr[j + 1])
                {   temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            i--;
        }
    }
    int main()
    {
        //测试数据
        int arr[] = {5, 4, 1, 3, 6};
        //冒泡排序
        bubbleSort(arr, 5);
        //打印排序结果
        int i;
        for(i = 0; i < 5; i++) {
            printf("%4d", arr[i]);
        }
    }

    快排:

    /***************************************
    
              快排
    
    ***************************************/
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<ctype.h>
    #include<stdbool.h>
    
    void swap(int* a, int* b)   //交换两元素的值
    {
        int t;
        t = *a;
        *a = *b;
        *b = t;
    }
    
    void printArray(int a[], int count)   //打印数组元素
    {
        int i;
        for(i = 0; i < count; i++) {
            printf("%d ", a[i]);
        }
        printf("
    ");
    }
    
    void quick_sort(int a[], int left, int right)
    {
        int i = left + 1, j = right;
        int  key = a[left];
        if(left >= right) {
            return;
        }
        /* 从i++和j--两个方向搜索不满足条件的值并交换  *
         * 条件为:i++方向小于key,j--方向大于key      */
        while(1) {
            while(a[j] > key) {
                j--;
            }
            while(a[i] < key && i < j) {
                i++;
            }
            if(i >= j) {
                break;
            }
            swap(&a[i], &a[j]);
            if(a[i] == key) {
                j--;
            }
            else {
                i++;
            }
        }
        /* 关键数据放到‘中间’ */
        swap(&a[left], &a[j]);
        if(left  < i - 1) {
            quick_sort(a, left, i - 1);
        }
        if(j + 1 < right) {
            quick_sort(a, j + 1 , right);
        }
    }
    
    int main(void)
    {
        int a[] = {3, 5, 4, 6, 9, 7, 8, 0, 1};
        int n = sizeof(a) / sizeof(*a);
        printArray(a, n);
        quick_sort(a, 0, n);
        printArray(a, n);
        return 0;
    }
  • 相关阅读:
    一年来把自己从学.Net到用.Net,收集的资料共享出来B/s中的存储过程(二)
    收集的.Net文章(十五)ASP.NET 2.0 Caching For performance
    收集的.Net文章(十六)SQL Server日期计算
    P.V操作原语和信号量
    2004年2008年系分论文题目整理,考SA的可以看一下
    2010年个人总结
    MASM,NASM和AT&T汇编格式备注
    Unity Application Block 学习笔记之一使用配置文件
    Javascript 学习笔记之String类测试
    javascript学习笔记之Object类型测试
  • 原文地址:https://www.cnblogs.com/chenyang920/p/5002486.html
Copyright © 2020-2023  润新知