DAY 9 学习日记&CSP-J初赛知识4:图型数据结构&选择排序

CSP-J初赛知识4

图型数据结构

图的定义

由点和线组成的网格称之为图,其中点称之为顶点或者结点,线称之为边。

图的性质

1. 有向边和无向边
有向边

顾名思义,即有指向方向的边。

无向边

顾名思义,即没有指向方向的边。

2. 关于顶点(在有向图中)
顶点的入度

顶点被箭头指向的数目。

小技巧

有向边的数量=入度和。

顶点的出度

顶点指出的箭头的数目。

小技巧

有向边的数量=出度和。

3. 关于顶点(在无向图中):顶点的度数

顶点连接的边的数目。

4. 边的权值

若边上有数值,该数值称为“边权”,边权的实际意义可以是长度、费用等。

5. 点的权值

若点上有数值,该数值称为“点权”,点权也可以有若干种实际意义。

6. 路径

从图上一点x到达图上另一点y的通路称为一条路径。

7. 环

若一条路径的起点和终点相同,则称之为环。

8. 连通

若图中两个点有路径,则称该两个点是连通的。

9. 连通图

若一张图中的任意两点都连通,称这张图为连通图。

10. 重边

两个点之间不止一条边时,称这两个点之间的边为重边。

11. 自环

一条边的出点和入点相同,称之为自环。

图的分类

1. 简单图

没有自环、没有重边的图。

2. 有向图和无向图

全部由有向边构成的图称之为有向图,全部由无向边构成的图称之为无向图。

3. 有权图和无权图

边是否有权值区分有权图和无权图。

4. 有环图和无环图

图中是否有环区分有环图和无环图。

5. 稠密图和稀疏图

有很少条边或弧(边的条数|E|远小于|V|²)的图称为稀疏图(sparse graph),边的条数|E|接近|V|²,称为稠密图(densegraph)。简单来说边越多,图就越稠密(其中|V|是结点数的意思,有时也用n来表示)。

图的分类有多种角度,这里不一一介绍了。

图的存储

方法1:邻接矩阵

使用一个二维数组g[i][j]表示点i到点j的边权,该二维数组g[][]称为“邻接矩阵”。

方法2:邻接链表

使用一个链表表示一个点指向的其余顶点,则n个点构成的n条链表表示一张图,这些链表称为“邻接链表”。

优缺点

无论用哪种方式存储图,都可以由存储信息“还原”图的形态和数量关系。邻接矩阵访问效率高,但是存储效率低(空间浪费大,尤其是在存储稀疏图时);邻接链表访问效率低,但是存储效率高(空间浪费少)。

有关图中边数量的公式

有向图

有向图的边数量最大为|V|*(|V|-1)(其中|V|是结点数的意思,有时也用n来表示)。

无向图

无向图的边数量最大为|V|*(|V|-1) /2(其中|V|是结点数的意思,有时也用n来表示)。

选择排序(Select sorting)

原理

  • 从左到右确定第i个位置的元素。
  • 选择 [i,n] 区间内最值所在的位置pos,交换a[i]和a[pos]。
  • 重复上述两部,直到所有位置确定。

举例:

 

 代码实现

1. C++ 版
void selectSort()
{
    for(int i=1;i<=n;i++)
    {
        int pos=i;
        for(int j=i+1;j<=n;j++)
        {
            if(a[j]<a[pos])
            {
                pos=j;
            }
        }
        swap(a[i],a[pos]);
    }
    return ;
}
2. JAVA 版
import java.util.Arrays;
public class example2 
{
    public static void main(String[] args) 
    {
        int[] selectNums = {25, 63, 78, 45, 132, 7};
        selectSort(selectNums);
        System.out.println(Arrays.toString(selectNums));
 
    }
    public static void swap(int[]nums,int i,int j)
    {
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
    public  static void selectSort(int[] nums)
    {
        for(int i=0;i<nums.length-1;i++)
        {
            int temp=i;
            for(int j=i+1;j<nums.length;j++)
            {
                if(nums[j]<nums[temp])
                    swap(nums,j,temp);
            }
        }
    }
}
3. Python 3.8 版
def selection_sort(data_sort_selection_list):
    minimum_to_maximum = []while len(data_sort_selection_list) > 0:
    time = data_sort_selection_list[0],
    for times in range(len(data_sort_selection_list)):
        if data_sort_selection_list[times] < minimum:
        minimum = data_sort_selection_list[times]
        time = times
        minimum_to_maximum.append(minimum)
        del data_sort_selection_list[time]
return minimum_to_maximumprint(selection_sort([4,6,2,3,3]))
4. Go 版
func SelectionSort(nums []int) []int 
{
    length := len(nums)
    var minIndex, tmp int
    for i := 0; i < length-1; i++ 
    {
        minIndex = i
        for j := i + 1; j < length; j++ 
        {
            if nums[j] < nums[minIndex] 
            { 
                minIndex = j 
            }
        }
        tmp = nums[i]
        nums[i] = nums[minIndex]
        nums[minIndex] = tmp
    }
    return nums
}
5. Javascript 版
function selectionSort(arr) {
            function swap(a, b) {
                let temp = arr[b];
                arr[b] = arr[a];
                arr[a] = temp;
            }
            for (let i = 0; i < arr.length; i++) {
                let minIndex = i;
                for (let j = i + 1; j < arr.length; j++) {
                    if (arr[minIndex] > arr[j]) {
                        minIndex = j;
                    }
                }
                swap(i, minIndex);
            }
        }

时间复杂度

O(n^{2})

稳定性

不稳定。

例子

             2            2           1

             a            b           c      //给两个2区分

             swap(a,c);

             1            2           2

             c             b           a

            

我们发现,当a和c交换后b在a前面了,所以不稳定。

DAY 9 学习日记

今天好冷{{{(>_<)}}},一路小跑去上课,没想到今天学图型数据结构,正好是我最近想自学的,(*^▽^*)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值