常见的4种排序算法的总结(用图形辅助理解)

1.冒泡 (从小到大)


function bubbleSort2(arr){

var len = arr.length;

for (var i = 0; i <= len - 1; i++){

for (var j = 0; j <= len - i ; j++){

if ( arr [ j + 1] < arr [ j ]){

var temp

temp = arr[ j ];

arr [ j ] = arr[ j + 1 ]

arr [ j + 1] = temp;

}

}

}

return arr;

}

这种算法不多说,有点变成基础的人都能看明白,可以说是“傻瓜排序” 

2.快速排序 (从小到大)


function quickSort(arr) {

if ( arr.length == 0){

return [ ]; //返回空数组

}

var cIndex = Math.floor( arr.length / 2);

var c = arr.splice( cIndex, 1);

var l = [ ];

var r = [ ];

 

for (var i = 0; i < arr.length; i++ ){

if (arr[ i ] < c){

l.push(arr[ i ])

}else {

r.push(arr[ i ])

}

}

return quickSort( l ).concat(c, quickSort( r ) )

}

3.选择排序(从小到大)


function selectionSort(arr) {

  var len = arr.length;

  var minIndex, temp;

  console.time('选择排序耗时');

  for (var i = 0; i < len - 1; i++) {

    minIndex = i;

    for (var j = i + 1; j < len; j++) {

      if (arr[j] < arr[minIndex]) { //寻找最小的数

        minIndex = j; //将最小数的索引保存

      }

    }

    temp = arr[i];

    arr[i] = arr[minIndex];

    arr[minIndex] = temp;

  }

  console.timeEnd('选择排序耗时');

  return arr;

}

4.插入排序


function insertionSort(array) {

  console.time('插入排序耗时:');

  for (var i = 1; i < array.length; i++) {

    var key = array[i];

    var j = i - 1;

    while ( array[j] > key) {

      array[j + 1] = array[j];

         j--;

    }

    array[j + 1] = key;

  }

  console.timeEnd('插入排序耗时:');

  return array;

}

最后插入两张图,提醒自己时刻保持学习状态!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kruskal算法可以用C语言来实现,例如用C构建一个动态图形演示,可以使用有着权重的图,以及两个数组来实现Kruskal算法。可以使用一个循环来遍历每一条边,比较它们的权重,如果权重小于最小生成树的权重,则将其加入最小生成树中。 ### 回答2: Kruskal算法是一用于求解最小生成树的算法,其核心思想是从边的集合中逐渐选择边,直到选择出n-1条边为止,其中n是图的顶点数。而动态图形演示则是通过图形界面展示算法的执行过程,使得用户能够更直观地理解算法的执行过程和结果。 要在C语言中编写Kruskal算法的动态图形演示,可以使用一些图形库,如OpenGL或者SDL等。具体步骤如下: 1. 创建基本的图形界面,包括显示图形的窗口、绘制边和顶点等。 2. 通过鼠标或者键盘等方式,让用户输入图的顶点数和边的信息,如边的权重。 3. 根据用户输入的边的信息,绘制图的初始状态。 4. 实现Kruskal算法,可以使用并查集等数据结构辅助。 5. 在算法执行过程中,根据选择的边,用不同的颜色或者标记来表示已选边和未选边。 6. 在每一步执行完毕后,更新图形界面,显示当前的最小生成树。 7. 当选出n-1条边后,算法结束,显示最终的最小生成树。 8. 提供重置按钮,让用户能够重新输入边的信息,以及重新执行算法。 通过以上步骤,我们可以在C语言中编写一个动态图形演示的Kruskal算法。由于涉及到图形库的使用,所以需要熟悉相关的图形库的函数和用法。同时,要注意在实现算法过程中,要合理利用图形库提供的函数和接口,实时更新图形界面,以实现动态展示的效果。 ### 回答3: 要用C语言编写Kruskal算法的动态图形演示,可以使用图形库如SDL或OpenGL来实现动态的图形展示效果。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdbool.h> #include <SDL.h> // 定义图的最大边数 #define MAX_EDGES 100 // 边的结构体 typedef struct { int start; // 起始节点 int end; // 终止节点 int weight; // 权重 } Edge; // 图的结构体 typedef struct { int vertices; // 节点数 Edge edges[MAX_EDGES]; // 边 } Graph; // 初始化图的函数 void initGraph(Graph* graph, int vertices) { graph->vertices = vertices; } // 添加一条边的函数 void addEdge(Graph* graph, int start, int end, int weight) { Edge edge = {start, end, weight}; graph->edges[graph->vertices++] = edge; } // 比较函数用于排序边 int compare(const void* a, const void* b) { Edge* edge1 = (Edge*)a; Edge* edge2 = (Edge*)b; return edge1->weight - edge2->weight; } // Kruskal算法的实现函数 void kruskal(Graph* graph) { // 按权重对边进行排序 qsort(graph->edges, graph->vertices, sizeof(Edge), compare); // 创建一个空的集合,用于存放最小生成树的边 Edge result[MAX_EDGES]; // 初始化所有顶点的集合 int parent[graph->vertices]; for(int i = 0; i < graph->vertices; i++) { parent[i] = i; } int count = 0; // 计数,用于判断是否已经找到了足够的边构成最小生成树 // 遍历所有的边 for(int i = 0; i < graph->vertices; i++) { int start = graph->edges[i].start; int end = graph->edges[i].end; // 找到两个顶点的根节点 int rootStart = start; while(parent[rootStart] != rootStart) { rootStart = parent[rootStart]; } int rootEnd = end; while(parent[rootEnd] != rootEnd) { rootEnd = parent[rootEnd]; } // 如果两个根节点不同,则将这条边加入结果集合,并将两个根节点合并 if(rootStart != rootEnd) { result[count++] = graph->edges[i]; parent[rootStart] = rootEnd; } } // 输出最小生成树 printf("最小生成树的边:\n"); for(int i = 0; i < count; i++) { printf("%d -> %d, 权重:%d\n", result[i].start, result[i].end, result[i].weight); } } int main() { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("Kruskal Algorithm", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); // 创建一个具有5个节点的无向图 Graph graph; initGraph(&graph, 5); // 添加边,每条边的权重表示为线的长度 addEdge(&graph, 0, 1, 2); addEdge(&graph, 1, 2, 3); addEdge(&graph, 2, 3, 1); addEdge(&graph, 3, 4, 4); addEdge(&graph, 4, 0, 5); kruskal(&graph); bool quit = false; SDL_Event e; while (!quit) { while (SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) { quit = true; } } SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); SDL_RenderClear(renderer); // 在窗口中绘制图形 SDL_RenderPresent(renderer); } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 以上的示例程序实现了Kruskal算法的主要逻辑和图形界面展示。你可以根据自己的需求和喜好进一步完善图形效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值