内容提要

1. 我掌握的排序算法的时间复杂度

2. 我掌握的6种排序算法(插入, 冒泡, 选择, 归并, 快速, 希尔)

3. 迷宫的搜索方法(深度优先 + 广度优先)


各种排序的时间复杂度

名称 稳定 否 平均时间复杂度
插入排序 稳定 n2
冒泡排序 稳定 n2
选择排序 n2
归并排序 稳定 nlog2n
希尔排序 n2
快速排序 nlog2n

各种排序算法

1. 插入排序

类似打扑克, 来一个数, 从这个数的前一个数开始, 一直到第一个数, 比这个数小的, 比如位置是 a, 那么 a 之前的都比这个数小, 所以, 要移动 a 以后到这个数以前的数, 向后移动一位, 然后将这个数插入到 a+1 的位置上

#include<stdio.h>

int a[10] = {
    10, 2, 5, 1, 3, 4, 6, 7, 9, 8
};

void insert_sort()
{
    int j = 1;     /* 插入location */
    int i ;
    int key = -1;
    for (j=1; j<10; j++) {
        i = j - 1;
        key = a[j];
        /* 移动元素 */
        while (i>=0 & a[i] > key) {
            a[i+1] = a[i];
            i--;
        }
        a[i+1] = key;
    }
}

int main(void)
{
    int i = 0;
    printf("-------- now the data --------:\n");
    for (i=0; i<10; i++) {
        printf("%d, ", a[i]);
    }
    insert_sort();
    printf("\n-------- after insert sort --------:\n");
    for (i=0; i<10; i++) {
        printf("%d, ", a[i]);
    }
}

2. 冒泡排序

第一个循环就是控制循环次数, 没有别的意义, 在每次循环内部, 两两比较, 这样, 最大的数, 第一次循环就冒出去了, 以此类推, 逐渐冒出去第2大, 第3大的数.

#include <stdio.h>

#define LEN 10

int a[LEN] = {10, 5, 6, 7, 8, 1, 4, 2, 9, 3};

void maopao_sort(void)
{
    int count = 0;
    int circle = LEN;
    int i = 0;
    int j = 1;
    int temp;
    for (count=0; count<LEN; count++) {    // 总循环次数 
        circle--;
        for (i=0; i<circle; i++) {
            if (a[i+1] < a[i]) {
                temp = a[i+1];
                a[i+1] = a[i];
                a[i] = temp;
            }
        }
    }   
}

int main(void)
{
    int i = 0;
    maopao_sort();
    for (i=0; i<LEN; i++) {
        printf("%d,", a[i]);
    }
    return 0;
}

3. 选择排序

第一个循环是控制循环次数, 每次找出这个循环中最小的数,放在第一个位置, 然后再从第2个数开始找, 找出第二次循环中最小的数,放在第2个的位置上, 以此类推

#include<stdio.h>

#define LEN 10

int a[LEN] = {
    10, 2, 5, 3, 4, 1, 7, 6, 8, 9
};

void selectSort()
{
    int temp;
    int i;
    int j;
    for (i=0; i<LEN; i++) {
        for (j=i+1; j<LEN; j++) {
            if (a[j] < a[i]) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
}

int main(void)
{
    int i;
    selectSort();
    for (i=0; i<LEN; i++) {
        printf("%d,", a[i]);
    }   
    return 0;
}

4. 归并排序(个人最喜欢的排序)

递归思想, 首先, 将所有的数分为两部分, 这两部分排好序后,再整合(归并) merge, 整合时, 因为左右两边都是已经排好序的, 所以, 排序起来容易很多.

#include<stdio.h>

#define LEN 10

int a[LEN] = {
    10, 7, 4, 2, 3, 1, 8, 9, 5, 6
};

void merge(int start, int mid, int end)
{
    int n1 = mid - start + 1;
    int n2 = end - mid;
    int left[n1];
    int right[n2];
    int i, j, k;
    // init left and right
    for (i=0; i<n1; i++) {
        left[i] = a[start+i];
    }   
    for (j=0; j<n2; j++) {
        right[j] = a[mid+1+j];
    }
    i = j = 0;
    k = start;
    // merge
    while (i < n1 && j < n2) {
        if (left[i] <= right[j]) {
            a[k++] = left[i++];
        } else {
            a[k++] = right[j++];
        }
    }
    while (i < n1) {
        a[k++] = left[i++];
    }
    while (j < n2) {
        a[k++] = right[j++];
    }
           
}

void sort(int start, int end)
{
    int mid;
    if (start < end) {
        mid = (end + start) / 2;
        sort(start, mid);
        sort(mid+1, end);
        merge(start, mid, end);
    }   
}

int main(void)
{
    int i;
    sort(0, LEN-1);
    for(i=0; i<LEN; i++) {
        printf("%d,", a[i]);
    }   
   
    return 0;
}

5. 希尔排序

插入排序的升级版, 算法: 首先定义一个步长, 一般设定为 LEN/2, 然后相隔这个步长的元素进行插入排序, 这个步长逐步缩小, 直到步长为1 .

#include<stdio.h>

# define LEN 10
int a[LEN] = {
    10, 2, 4, 1, 6, 8, 3, 5, 9, 7
} ;

void Shell_sort()
{
    int d = LEN / 2;
    int j;
    int i;
    int temp;
    while (d > 0) {    /* 步长控制总的循环次数 */
        for (j=d; j<LEN; j++) {  /* 类似插入排序中的 j=1 */
            i = j-d;             /* 从插入为的前一位开始比较, 注意这个前一位是间隔前步长位 */
            temp = a[j];
            /* 移位 */
            while (i>=0 && a[i] > temp) {   /* 注意: 这里一定要是 temp, 而不能是 a[j], 因为循环内部已经改变了a[j]的值 */
                a[i+d] = a[i];
                i -= d;
            }
            a[i+d] = temp;     /* 插入操作 */ 
        }
       
        d = d/2;   
    }
}

int main(void)
{
    int i;
    Shell_sort();   
    for (i=0; i<10; i++) {
        printf("%d, ", a[i]);
    }
}

6. 快速排序

快速排序是冒泡排序的升级版, 采用了分治策略, 首先把序列分成两个子序列, 递归对子序列进行排序. 首先找到一个轴, 对序列进行重新排序, 比轴小的放到轴左边, 比轴的放到轴右边, 划分后, 轴的位置就是正确的(即数组下标不会在发生改变了), 递归对两个子序列进行重新排序.

#include<stdio.h>

#define LEN 10

int a[LEN] = {
    10, 5, 3, 2, 1, 7, 8, 6, 9, 4
};

int position(int start, int end)
{
    int dp = start;
    int i = start; /* 左边指针 */
    int j = end;   /* 右边指针 */
    int temp;
    while (i < j) {
        for(; i<dp; i++) {
            if (a[i] > a[dp]) {
                temp = a[i];
                a[i] = a[dp];
                a[dp] = temp;
                dp = i;
            }   
        }
       
        for (; j>dp; j--) {
            if (a[j] < a[dp]) {
                temp = a[j];
                a[j] = a[dp];
                a[dp] = temp;
                dp = j;
            }   
        }
    }
    return dp;
       
}

void short_sort(int start, int end)
{
    int dp;
    dp = position(start, end);
    printf("\ndp location: %d\n", dp);
    if (start < end) {
        short_sort(start, dp-1);
        short_sort(dp+1, end);
    }   
}

int main(void)
{
    int i;
    short_sort(0, LEN-1);
    for (i=0; i<LEN; i++) {
        printf("%d, ", a[i]);
    }   
}


迷宫深度优先, 广度优先

参考本blog中的 栈和队列

深度优先 用栈实现

广度优先 用队列实现, 特别的地方是, 用栈实现的广度优先, 在入队列时, 要记录对应的上一步的位置, 因为它不同栈, 栈的上一步的位置是按照栈的先后顺序存储的.

排序算法 & 迷宫的深度, 广度优先的更多相关文章

  1. 基于python的七种经典排序算法

    参考书目:<大话数据结构> 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. ...

  2. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  3. 基于python的七种经典排序算法(转)

    一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性:经过某种排序后,如果两个 ...

  4. 排序算法 python实现

    一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两 ...

  5. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

  6. [Data Structure & Algorithm] 八大排序算法

    排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序 ...

  7. 排序算法 ----(转载::http://blog.csdn.net/hguisu/article/details/7776068)

    1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序 ...

  8. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  9. Java常用排序算法+程序员必须掌握的8大排序算法

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

随机推荐

  1. HDU 5898:odd-even number(数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数.(1< ...

  2. ecshop后台通过ajax搜索原理

    ecshop的搜索其实是功能十分强大的,但是ecshop搜索功能前台和后台还不大一样,前台主要是通过get方式,提交的url进行分页,而在ecshop的后台,则是接受表单的搜索条件,然后通过js发布到 ...

  3. Redis 安装 启动 连接 配置 重启

    Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# .tar.gz ]# cd redis- ]# ma ...

  4. Python 中translate()与replace()区别

    translate函数和replace函数一样,用于替换字符串中的某个部分,但是和replace不同,translate只处理单个字符,而且可以同时进行多个替换.在使用translate函数转换之前, ...

  5. Java学习之路(六)

    1:包及和访问权限 将类放置到一个包当中,需要使用package “包名” 编译时需要使用 -d 参数  该参数的作用是依照包名生成相应的文件夹 一个类的全民应该是  “包名” + “.” + “类名 ...

  6. 基本Socket通信流程

    服务器常用模型 1.初始化Socket (用于监听) 1)初始化 SOCKET s ; s =  Socket ( ... ) 2)绑定 bind(s, ...); 3)监听 listen(s, .. ...

  7. ubuntu /etc/profile和/etc/environment的比较

    先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文. 将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_C ...

  8. 制作变形、移位、扭曲等效果:《CSS3 transform》

    今天开始我们一起来学习有关于CSS3制作动画的几个属性:变形(transform).转换(transition)和动画(animation)等更高级的CSS3技术.本文主要介绍的是这三个属性之中的第一 ...

  9. MySQL的事务

    MySQL的事务 1.事务:事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行,要么全部放弃执行. 2.事务具备的四个特性(简称为ACID性): (1)原子性(Atomic ...

  10. php5.3之前版本升级至5.3以及更高版本后部分语法简单归纳

    1. Deprecated: Assigning the return value of new by reference is deprecated in /usr/local/www/uugui/ ...