热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

排序总结介绍

Sort-SummaryAuthor:liyazhouGithub:li-yazhouRepo:https:github.comli-yazhoualgorithm-primere

Sort-Summary


Author: liyazhou

Github: li-yazhou

Repo: https://github.com/li-yazhou/algorithm-primer

email: xcliyazhou@163.com


  • 排序
    • 冒泡排序
    • 选择排序
    • 插入排序
    • 希尔排序
    • 归并排序
    • 快速排序
    • 堆排序



排序


排序算法分类


  1. 插入排序: 直接插入、希尔排序
  2. 选择排序: 简单选择、堆排序
  3. 交换排序: 冒泡排序、快速排序
  4. 归并排序: 归并排序

其他排序:桶排序、基数排序、计数排序

排序算法稳定性

稳定性的排序:

  1. 冒泡排序
  2. 插入排序(直接插入排序、折半插入排序)
  3. 归并排序
  4. 基数排序

非稳定性的排序

  1. 选择排序
  2. 堆排序
  3. 希尔排序
  4. 快速排序

排序算法时间和空间复杂度对比

这里写图片描述

冒泡排序

遍历数组array,下标 i 的范围是[0, length);
当遍历到下标为 i 的元素时,当前元素和 [i, length)中的最小元素交换位置。
通俗的描述是,
遍历数组,选择当前位置到末尾的所有元素中的最小者,与当前元素交换位置
也即是,不断地选择剩余元素(包含当前元素)中的最小者,与当前元素交换位置

冒泡排序缺点,运行时间与输入无关。

为了找出剩余元素中的最小者而扫描一遍数组,但并不能为下一遍的扫描提供可以利用的信息。
对于一个有序的数组(或者全部元素都相等的数组)和一个元素随机排列的数组所需要的排序时间是一样的。
而其他算法更善于利用输入的初始状态。

冒泡排序优点,数据移动是最少的。

选择排序用了 N 次交换 —— 交换次数和数组的大小是线性相关的。
而其他排序算法的交换次数大多是线性对数或者平方级别的。

public class Bubble {/*** 冒泡排序* 第二层循环&#xff0c;从后往前进行&#xff0c;注意边界* &#64;param arr 数组*/public static void bubbleSort(int[] arr){if (arr &#61;&#61; null || arr.length &#61;&#61; 0) return;for (int i &#61; 0; i < arr.length; i &#43;&#43;){for (int j &#61; arr.length-1; j > i; j --){if (arr[j] < arr[j-1]){int tmp &#61; arr[j];arr[j] &#61; arr[j-1];arr[j-1] &#61; tmp;}}}}/*** 冒泡排序 —— “下沉排序”* 第二层循环&#xff0c;从前往后运行&#xff0c;注意边界* &#64;param arr 数组*/public static void bubbleSort2(int[] arr){if (arr &#61;&#61; null || arr.length &#61;&#61; 0) return;for (int i &#61; 0; i < arr.length; i &#43;&#43;){for (int j &#61; 1; j < arr.length-i; j &#43;&#43;){if (arr[j] < arr[j-1]){int tmp &#61; arr[j];arr[j] &#61; arr[j-1];arr[j-1] &#61; tmp;}}}}
}

选择排序

遍历数组array&#xff0c;下标 i 的范围是[0, length)&#xff1b;

当遍历到下标为 i 的元素时&#xff0c;当前元素和 [i, length)中的最小元素交换位置。

通俗的描述是&#xff0c;遍历数组&#xff0c;选择当前位置到末尾的所有元素中的最小者&#xff0c;与当前元素交换位置。
也即是&#xff0c;不断地选择剩余元素&#xff08;包含当前元素&#xff09;中的最小者&#xff0c;与当前元素交换位置

缺点&#xff0c;运行时间与输入无关。

为了找出剩余元素中的最小者而扫描一遍数组&#xff0c;但并不能为下一遍的扫描提供可以利用的信息。
对于一个有序的数组&#xff08;或者全部元素都相等的数组&#xff09;和一个元素随机排列的数组所需要的排序时间是一样的。
而其他算法更善于利用输入的初始状态。

优点&#xff0c;数据移动是最少的。

选择排序用了 N 次交换 —— 交换次数和数组的大小是线性相关的。
而其他排序算法的交换次数大多是线性对数或者平方级别的。

public class Selection {public static void sort(Comparable[] arr){for (int i &#61; 0; i < arr.length; i &#43;&#43;){int minIdx &#61; i;for (int j &#61; i &#43; 1; j < arr.length; j &#43;&#43;){if (arr[j].compareTo(arr[minIdx]) < 0)minIdx &#61; j;}if (minIdx !&#61; i){Comparable tmp &#61; arr[i];arr[i] &#61; arr[minIdx];arr[minIdx] &#61; tmp;}}}
}

插入排序

一个形象生动的比喻&#xff1a;一张一张地整理扑克牌&#xff0c;将每一张牌插入到已经整理好的扑克中
依次插入元素&#xff0c;每次插入新的元素后&#xff0c;保持已插入元素的顺序性。

怎么保证已插入元素的顺序性呢&#xff1f;
从右向左的方向和已排序数组比较&#xff0c;如果当前元素比它小&#xff0c;则交换两者&#xff0c;
直到当前元素位于第一个位置或者是前面没有比其更大的元素。

优化&#xff0c;减少元素交换的次数
在已排序的元素中从右向左找到第一个等于或者小于当前元素的位置&#xff0c;
将位于它后面而且是已排序的元素依次往后移动一位&#xff0c;并将当前元素插入它的后面即可。

适用场景&#xff0c;插入排序所需的时间取决于数组中元素的初始顺序。适用当数组是部分有序的时候&#xff0c;插入排序效率会有明显提升。

public class Insertion {public static void sort(Comparable[] arr){for (int i &#61; 0; i < arr.length; i &#43;&#43;){for (int j &#61; i; j > 0 && arr[j].compareTo(arr[j-1]) < 0; j --){Comparable tmp &#61; arr[j];arr[j] &#61; arr[j-1];arr[j-1] &#61; tmp;}}}public static void sort2(Comparable[] arr){for (int i &#61; 0; i < arr.length; i &#43;&#43;){Comparable newEle &#61; arr[i];int j &#61; i-1;// 从右向左找到第一个小于或者等于当前值的元素&#xff0c;找到返回其下标// 边界问题&#xff08;如果已插入的所有元素均比当前值大&#xff0c;则 j &#61; -1&#xff1b;如果已插入的所有元素均比当前值小&#xff0c;j &#61; i-1&#xff09;for (; j >&#61; 0 && arr[j].compareTo(newEle) > 0; j --);for (int k &#61; i; k > 0 && k > j; k --) arr[k] &#61; arr[k-1]; // 将这些较大的元素依次向右移动arr[j&#43;1] &#61; newEle; // 将新元素插入其从右边起第一个比其小的元素后面即可}}
}

希尔排序

shell sort&#xff0c;希尔排序&#xff0c;也称为缩减增量排序算法&#xff0c;递减增量排序算法

  1. 先取一个小于n的整数d1作为第一个增量&#xff0c;把文件的全部记录分成d1个组。
  2. 所有距离为d1的倍数的记录放在同一个组中&#xff0c;在各组内进行直接插入排序。
  3. 取第二个增量d2
  4. 直至所取的增量dt&#61;1(dt

更直白的描述

  1. 将数组间隔为increment的元素分别划分到若干个小组&#xff0c;对每一个小组进行直接插入排序&#xff08;每一小组的数据量较小&#xff0c;操作代价更小&#xff09;&#xff1b;
  2. 不断地减小间隔&#xff0c;将数组划分为更多个小组&#xff0c;继续对每一个小组进行直接插入排序&#xff08;可以使近邻的元素基本有序&#xff09;&#xff1b;
  3. 最后&#xff0c;将数组划分为 N 个小组&#xff0c;也即是对全体元素进行一次直接插入排序。
    &#xff08;最后一步&#xff0c;数组已经基本有序&#xff0c;就对数组直接插入排序&#xff09;

希尔排序算法的解释&#xff0c;在数组内的元素基本有序的情况下&#xff0c;直接插入排序是非常高效的。
而希尔排序就是创造基本有序的条件&#xff0c;之后进行直接插入排序的。

解释它的做法&#xff0c;

希尔排序的思想是使数组中任意间隔为 increment 元素都是有序的。
对间隔为increment的元素进行直接插入排序&#xff0c;可以使一个元素一次性地朝着最终位置前进一大步
缩小间隔 increment&#xff0c;可以使任意一个局部的元素都是基本有序的。
当数组基本有序时&#xff0c;对全体元素进行直接插入排序。

public class Shell {public static void sort(Comparable[] arr){int increment &#61; arr.length;do{increment &#61; increment/3 &#43; 1; // 当前的增量&#xff0c;保证最小增量是 1// 每次为一个分组添加一个的新的元素&#xff0c;直到把所有的元素添加到各个分组中for (int i &#61; increment; i < arr.length; i &#43;&#43;){ Comparable newEle &#61; arr[i]; // 待插入的新元素&#xff0c;下面的操作是找到合适的位置int j &#61; i-increment; // 组内的已排序的最后一个元素// 小组内新添加了一个元素&#xff0c;对其进行插入排序// 分组内所有比新元素大的元素依次向后移动increment位for (; j >&#61; 0 && arr[j].compareTo(newEle) > 0; j -&#61; increment) // 对每一个小组&#xff0c;组内插入排序arr[j&#43;increment] &#61; arr[j]; // 组内右边的元素较当前元素大&#xff0c;则一次往后移动一位arr[j&#43;increment] &#61; newEle; // 把新元素插入到合适的位置}} while (increment > 1); // 增量increment &#61; 1时&#xff0c;是对全体基本有序的数组进行插入排序&#xff0c;之后停止循环}
}

归并排序

归并排序的基本思想基于递归地拆分和合并&#xff0c;将两个或两个以上有序表合并成一个新的有序表。

将整个区间递归地拆分为小区间&#xff08;最小的区间长度为1&#xff09;&#xff0c;然后递归地合并两个有序的区间。

public class Merge {public static void sort(Comparable[] arr){if (arr &#61;&#61; null || arr.length < 2) return;Comparable[] aux &#61; new Comparable[arr.length]; // 归并排序所需要的辅助空间sort(arr, 0, arr.length-1, aux);}private static void sort(Comparable[] arr, int low, int high, Comparable[] aux) {if (low >&#61; high) return;int mid &#61; low &#43; (high - low)/2;sort(arr, low, mid, aux); // 将左部区间排序sort(arr, mid&#43;1, high, aux); // 将右部区间排序merge(arr, low, mid, high, aux); // 归并左右两部分区间的结果}/*** 合并位于 [low, mid] 和 [mid&#43;1, high] 这两段闭区间内的元素* 每一个区间的内部都是有序的* &#64;param arr 序列* &#64;param low 开始索引* &#64;param mid 中间索引* &#64;param high 末尾索引* &#64;param aux 辅助空间*/private static void merge(Comparable[] arr, int low, int mid, int high, Comparable[] aux) {int i &#61; low;int j &#61; mid &#43; 1;for (int k &#61; low; k <&#61; high; k &#43;&#43;) aux[k] &#61; arr[k];int k &#61; low;while (i <&#61; mid && j <&#61; high){if (aux[i].compareTo(aux[j]) < 0) arr[k&#43;&#43;] &#61; aux[i&#43;&#43;];else arr[k&#43;&#43;] &#61; aux[j&#43;&#43;];}while (i <&#61; mid) arr[k&#43;&#43;] &#61; aux[i&#43;&#43;];while (j <&#61; high) arr[k&#43;&#43;] &#61; aux[j&#43;&#43;];}
}

快速排序

快速排序的思想&#xff0c;从待排序的记录序列中选取一个记录&#xff08;通常选取第一个记录&#xff0c;此处有优化空间&#xff09;为枢轴&#xff0c;其关键字设置为 key1&#xff0c;
然后将其余关键字小于 key1 的记录移到前面&#xff0c;而将关键字大于 key1 的记录移动到后面&#xff0c;结果将待排序记录序列分为两个子表&#xff0c;
最后将关键字为 key1 的记录插到其分界线的位置处。将这个过程称为一趟快速排序。

通过一次划分后&#xff0c;就以关键字为 key1 的记录为界&#xff0c;将待排序序列分成了两个子表&#xff0c;且前面子表中所有记录的关键字均不大于key1&#xff0c;而后面子表中的所有记录的关键字均不小于 key1。

对分割后的子表继续按上述原则进行分割&#xff0c;直到所有子表的表长不超过 1 为止&#xff0c;此时待排序记录序列就变成了一个有序表。

快速排序的步骤

假设待划分序列为 arr[left], arr[left&#43;1], … , arr[right]&#xff0c;具体实现上述划分过程时&#xff0c;可以设置两个指针 i 和 j&#xff0c;它们的初始值分别为 left 和 right。

首先将基准记录 arr[left] 赋值给 key&#xff0c;使 arr[left]&#xff0c;即arr[i]相当于空单元&#xff0c;然后反复进行如下两个扫描过程&#xff0c;直到 i 和 j 相遇。

a. j 从右向左扫描&#xff0c;直到 arr[j] b. i 从左向右扫描&#xff0c;直到 arr[i] > key 时&#xff0c;将 arr[i] 移至空单元 arr[j]&#xff0c;此时 arr[i]相当于空单元。

当 i 和 j 相遇时&#xff0c;arr[i] &#xff08;或 arr[j]&#xff09;相当于空单元&#xff0c;且 arr[i] 左边所有记录均不大于基准记录&#xff08;切分元素&#xff09;&#xff0c;而 arr[i] 右边所有记录均不小于基准记录&#xff08;切分元素&#xff09;。
最后&#xff0c;将基准记录&#xff08;切分元素&#xff09;移至 arr[i] 中&#xff0c;就完成了一次划分过程。

对于 arr[i] 左边的子表和 arr[i] 右边的子表可采用同样的方法进行进一步划分。

通俗地表述&#xff1a;
1. 从待排序的数列中选择一个元素&#xff0c;作为基准元素&#xff08;pivot&#xff09;&#xff0c;也成为切分元素&#xff0c;通常选择第一个元素或者最后一个元素
2. 对数列排序&#xff0c;所有比基准值小的元素摆放在基准前面&#xff0c;所有比基准值大的元素摆放在基准后面&#xff08;相等的元素可以放到任意一边&#xff09;。
该基准就处于两部分的中间位置。这个称为分区&#xff08;partition&#xff09;操作。
3. 然后&#xff0c;分别对基准元素左右两部分用同样的方法继续进行排序&#xff0c;直到整个序列有序&#xff08;递归 recursive&#xff09;。

解释

冒泡排序&#xff0c;在扫描过程中只对相邻的两个元素进行比较&#xff0c;因此在交换两个相邻元素时只能消除一个逆序。
如果能通过两个&#xff08;不相邻的&#xff09;元素的交换&#xff0c;消除待排序数组中的多个逆序&#xff0c;则会加快交换排序的速度。
快速排序方法中的一次交换可能消除多个逆序。

public class Quick {public static void sort(Comparable[] arr, int low, int high){if (low < high){// 调用一趟快速排序&#xff0c;以切分元素&#xff08;枢轴元素 pivot&#xff09;为界划分两个子表int pos &#61; partition(arr, low, high);sort(arr, low, pos-1); // 对左部子表快速排序sort(arr, pos&#43;1, high); // 对右部子表快速排序}}private static int partition(Comparable[] arr, int low, int high) {Comparable key &#61; arr[low];while (low < high){// 从右到左找一个比切分元素key小的元素for (; low < high && arr[high].compareTo(key) >&#61; 0; high --);// 若找到一个比切分元素小的元素&#xff0c;则将它放置在低位&#xff0c;此时高位出生产一个空位// 低位处的初始值是切分元素&#xff0c;之后低位处是一个空位if (low < high) {arr[low] &#61; arr[high];low &#43;&#43;;}// 从左到右找一个比切分元素大的元素for (; low < high && arr[low].compareTo(key) <&#61; 0; low &#43;&#43;);// 若找到一个比切分元素大的元素&#xff0c;则将它放置在高位&#xff0c;此时低位产生一个空位if (low < high){arr[high] &#61; arr[low];high --;}}arr[low] &#61; key; // 将切分元素放置在空位// 为什么最后low一定是空位&#xff1f;// 因为当高位没有比key小的元素时&#xff0c;则低位产生了空位// 或者低位没有比key大的元素时&#xff0c;高位产生了空位&#xff0c;则while(low return low;}
}

堆排序

堆排序的过程

  • 创建最大堆

从最后一个非叶子结点到根结点&#xff08;从下向上&#xff0c;这点非常关键&#xff09;调整每一个子堆&#xff0c;使子堆有序化。
最开始的子堆的根结点是最后一个非叶子结点&#xff0c;它有一个或者两个孩子&#xff0c;它与较大者交换位置即可实现子堆有序化。
底部的子堆有序化&#xff0c;是其上面的堆进行调整的前提条件。
也即是&#xff0c;如果子堆是无序的&#xff0c;那么包含它的一个更大的堆就无法进行调整操作&#xff0c;
所以需要从最后一个非叶子结点到根结点&#xff08;从下向上&#xff0c;这点非常关键&#xff09;调整每一个子堆&#xff0c;使子堆有序化。。


  • 调整最大堆&#xff08;有序化堆&#xff09;

&#xff08;只有一个或者零个父结点相对孩子是无序&#xff09;
如果当前结点有孩子结点&#xff0c;
如果当前结点的孩子结点的较大者比当前结点大&#xff0c;则交换两者位置&#xff0c;
否则调整结束&#xff0c;退出&#xff0c;
继续比较当前结点与其新的孩子结点

堆排序的步骤

    1. 初始化最大堆&#xff08;使堆有序化&#xff0c;可能所有的子堆都是无序的&#xff0c;需要调整所有的子堆&#xff09;
    1. 将最大堆的第一个元素和最后一个元素交换位置&#xff1b;
      使堆的长度减 1&#xff1b;
      最大堆调整&#xff08;使堆有序化&#xff0c;只有第一个元素相对于它的孩子是无序的&#xff0c;不断调整此元素和其后代的相对位置即可&#xff09;&#xff1b;
      重复以上三步&#xff0c;直到堆的长度为 1。

索引关系

使用数组存储完全二叉树&#xff08;堆&#xff09;&#xff0c;则结点下标关系是&#xff1a;

父结点 i 的左子结点是 2 * i &#43; 1&#xff1b;
父结点 i 的右子结点是 2 * i &#43; 2&#xff1b;
子结点 i 的父结点是 floor((i-1)/2)
后一个非叶子结点是 floor(N/2)-1

public class Heap {public static void sort (Comparable[] arr){if (arr &#61;&#61; null || arr.length < 2) return;// 1. 创建堆// 从下向上使每一个有孩子的结点都成为一个有序堆&#xff08;宏观角度&#xff09;// 多次堆化&#xff0c;从下到上不断新加元素&#xff0c;因为单次堆化要求最多只有根结点相对于孩子结点是无序的&#xff0c;所以需要从后往前添加元素// 具体的堆化操作是从上到下完成的&#xff0c;而且一次堆化要求最多只有根结点相对于孩子结点是无序的&#xff0c;此外所有的子堆都是有序的for (int i &#61; arr.length/2-1; i >&#61; 0; i --) // 完全二叉树中最后一个有孩子的结点是 N/2-1maxHeapify(arr, i, arr.length);// 2. 堆排序for (int j &#61; arr.length - 1; j > 0; j --) {swap(arr, 0, j); // 堆首元素不断和堆尾元素交换位置&#xff0c;堆的大小减 1maxHeapify(arr, 0, j); // 将去掉一个元素的新堆调整为最大堆&#xff08;有序堆&#xff09;}}/*** 从上到下有序化堆&#xff0c;使小于孩子的父结点下沉&#xff08;sink&#xff09;* &#64;param arr 二叉堆* &#64;param index 待调整的子堆的根结点* &#64;param newSize 除了排序后的元素外&#xff0c;堆中剩余元素的个数*/// 具体的堆化操作是从上到下完成的&#xff0c;而且一次堆化要求最多只有根结点相对于孩子结点是无序的&#xff0c;此外所有的子堆都是有序的private static void maxHeapify (Comparable[] arr, int index, int newSize){while (2 * index &#43; 1 < newSize){ // 当前结点至少有左孩子int childIdx &#61; 2 * index &#43; 1; // index 左孩子的下标// 存在右孩子&#xff0c;且右孩子比左孩子更大&#xff0c;则记录右孩子的下标if (childIdx &#43; 1 < newSize && arr[childIdx].compareTo(arr[childIdx&#43;1]) < 0) childIdx &#43;&#43;;if (arr[childIdx].compareTo(arr[index]) <&#61; 0) break; // 两个孩子均小于等于当前元素&#xff0c;则退出循环swap(arr, index, childIdx);index &#61; childIdx; // 当前不断跟新的孩子比较&#xff0c;跟其中一个较大的孩子交换位置}}private static void swap(Comparable[] arr, int i, int j){Comparable tmp &#61; arr[i];arr[i] &#61; arr[j];arr[j] &#61; tmp;}
}

点击此处获取更多&#xff0c;本文github地址


推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 初始化初始化本地空版本库,仓库,英文名repositorymkdirtest&&cdtestgitinit克隆项目到本地gitclone远程同 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 安装oracle软件1创建用户组、用户和目录bjdb节点下:[rootnode1]#groupadd-g200oinstall[rootnode1]#groupad ... [详细]
  • python oj刷题网站_中小学计算机竞赛去哪里刷题?橙旭园OJ系统上线啦!
    原标题:中小学计算机竞赛去哪里刷题?橙旭园OJ系统上线啦!相信许多人在学习完编程之后都会茫然,感觉自己无所不能࿰ ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
author-avatar
港乄漫天地
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有