数据结构排序算法总结

数据结构排序算法总结

数据结构排序算法总结

概述

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

1.插入排序—直接插入排序(Straight Insertion Sort)

基本思想:

将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。

要点:设立哨兵,作为临时存储和判断数组边界之用。

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

算法的实现:

void print(int a[], int n ,int i){      cout<<i <<":";      for(int j= 0; j<8; j++){          cout<<a[j] <<" ";      }      cout<<endl;  }      void InsertSort(int a[], int n)  {      for(int i= 1; i<n; i++){          if(a[i] < a[i-1]){               //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入              int j= i-1;               int x = a[i];        //复制为哨兵,即存储待排序元素              a[i] = a[i-1];           //先后移一个元素              while(x < a[j]){  //查找在有序表的插入位置                  a[j+1] = a[j];                  j--;         //元素后移              }              a[j+1] = x;      //插入到正确位置          }          print(a,n,i);           //打印每趟排序的结果      }        }    int main(){      int a[8] = {3,1,5,7,2,4,9,6};      InsertSort(a,8);      print(a,8,8);  }

时间复杂度:O(n^2).

其他的插入排序有二分插入排序,2-路插入排序。

 2. 插入排序—希尔排序(Shell`s Sort)

希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进。希尔排序又叫缩小增量排序

基本思想:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

操作方法:

选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;按增量序列个数k,对序列进行k 趟排序;每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

算法实现:

我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n为要排序数的个数

即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

void print(int a[], int n ,int i){     cout<<i <<":";     for(int j= 0; j<8; j++){         cout<<a[j] <<" ";     }     cout<<endl; } /** * 直接插入排序的一般形式 * * @param int dk 缩小增量,如果是直接插入排序,dk=1 * */    void ShellInsertSort(int a[], int n, int dk) {     for(int i= dk; i<n; ++i){         if(a[i] < a[i-dk]){          //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入             int j = i-dk;                int x = a[i];           //复制为哨兵,即存储待排序元素             a[i] = a[i-dk];         //首先后移一个元素             while(x = 1  ){         ShellInsertSort(a, n, dk);         dk = dk/2;     } } int main(){     int a[8] = {3,1,5,7,2,4,9,6};     //ShellInsertSort(a,8,1); //直接插入排序     shellSort(a,8);           //希尔插入排序     print(a,8,8); }

希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子中除1 外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。

3. 选择排序—简单选择排序(Simple Selection Sort)

基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推…..

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,

直到整个序列按关键码有序。

算法实现:

void print(int a[], int n ,int i){      cout<<"第"<<i+1 <<"趟 : ";      for(int j= 0; j<8; j++){          cout<<a[j] <<"  ";      }      cout<<endl;  }  /**  * 数组的最小值  *  * @return int 数组的键值  */  int SelectMinKey(int a[], int n, int i)  {      int k = i;      for(int j=i+1 ;j a[j]) k = j;      }      return k;  }    /**  * 选择排序  *  */  void selectSort(int a[], int n){      int key, tmp;      for(int i = 0; i< n; ++i) {          key = SelectMinKey(a, n,i);           //选择最小的元素          if(key != i){              tmp = a[i];  a[i] = a[key]; a[key] = tmp; //最小元素与第i位置元素互换          }          print(a,  n , i);      }  }  int main(){      int a[8] = {3,1,5,7,2,4,9,6};      cout<<"初始值:";      for(int j= 0; j<8; j++){          cout<<a[j] <<"  ";      }      cout<<endl<<endl;      selectSort(a, 8);      print(a,8,8);  }

简单选择排序的改进——二元选择排序

简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下:

void SelectSort(int r[],int n) {      int i ,j , min ,max, tmp;      for (i=1 ;i <= n/2;i++) {            // 做不超过n/2趟选择排序           min = i; max = i ; //分别记录最大和最小关键字记录位置          for (j= i+1; j r[max]) {                   max = j ; continue ;               }                if (r[j]< r[min]) {                   min = j ;               }           }          //该交换操作还可分情况讨论以提高效率        tmp = r[i-1]; r[i-1] = r[min]; r[min] = tmp;        tmp = r[n-i]; r[n-i] = r[max]; r[max] = tmp;         }   }

4. 选择排序—堆排序(Heap Sort)

堆排序是一种树形选择排序,是对直接选择排序的有效改进。

基本思想:

堆的定义如下:具有n个元素的序列(k1,k2,…,kn),当且仅当满足

时称之为堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆)。
若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的。如:

(a)大顶堆序列:(96, 83,27,38,11,09)

  (b)  小顶堆序列:(12,36,24,85,47,30,53,91)

初始时把要排序的n个数的序列看作是一棵顺序存储的二叉树(一维数组存储二叉树),调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(或最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。称这个过程为堆排序。

因此,实现堆排序需解决两个问题:

如何将n 个待排序的数建成堆;

2. 输出堆顶元素后,怎样调整剩余n-1 个元素,使其成为一个新堆。

首先讨论第二个问题:输出堆顶元素后,对剩余n-1元素重新建成堆的调整过程。
调整小顶堆的方法:

1)设有m 个元素的堆,输出堆顶元素后,剩下m-1 个元素。将堆底元素送入堆顶((最后一个元素与堆顶进行交换),堆被破坏,其原因仅是根结点不满足堆的性质。

2)将根结点与左、右子树中较小元素的进行交换。

3)若与左子树交换:如果左子树堆被破坏,即左子树的根结点不满足堆的性质,则重复方法 (2).

4)若与右子树交换,如果右子树堆被破坏,即右子树的根结点不满足堆的性质。则重复方法 (2).

5)继续对不满足堆性质的子树进行上述交换操作,直到叶子结点,堆被建成。

称这个自根结点到叶子结点的调整过程为筛选。

再讨论对n 个元素初始建堆的过程。

建堆方法:对初始序列建堆的过程,就是一个反复进行筛选的过程。

1)n 个结点的完全二叉树,则最后一个结点是第个结点的子树。

2)筛选从第个结点为根的子树开始,该子树成为堆。

3)之后向前依次对各结点为根的子树进行筛选,使之成为堆,直到根结点。

 算法的实现:

从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。

void print(int a[], int n){      for(int j= 0; j<n; j++){          cout<<a[j] <<"  ";      }      cout<<endl;  }        /**  * 已知H[s…m]除了H[s] 外均满足堆的定义  * 调整H[s],使其成为大顶堆.即将对第s个结点为根的子树筛选,   *  * @param H是待调整的堆数组  * @param s是待调整的数组元素的位置  * @param length是数组的长度  *  */  void HeapAdjust(int H[],int s, int length)  {      int tmp  = H[s];      int child = 2*s+1; //左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置)      while (child < length) {          if(child+1 <length && H[child]<H[child+1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)              ++child ;          }          if(H[s]= 0; --i)          HeapAdjust(H,i,length);  }  /**  * 堆排序算法  */  void HeapSort(int H[],int length)  {      //初始堆      BuildingHeap(H, length);      //从最后一个元素开始对序列进行调整      for (int i = length - 1; i > 0; --i)      {          //交换堆顶元素H[0]和堆中最后一个元素          int temp = H[i]; H[i] = H[0]; H[0] = temp;          //每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整          HeapAdjust(H,0,i);    }  }     int main(){      int H[10] = {3,1,5,7,2,4,9,6,10,8};      cout<<"初始值:";      print(H,10);      HeapSort(H,10);      //selectSort(a, 8);      cout<<"结果:";      print(H,10);    }

分析:

设树深度为k,从根到叶的筛选,元素比较次数至多2(k-1)次,交换记录至多k 次。所以,在建好堆后,排序过程中的筛选次数不超过下式:               

而建堆时的比较次数不超过4n 次,因此堆排序最坏情况下,时间复杂度也为:O(nlogn )。

5. 交换排序—冒泡排序(Bubble Sort)

基本思想:

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

算法的实现:

void bubbleSort(int a[], int n){      for(int i =0 ; i< n-1; ++i) {          for(int j = 0; j  a[j+1])              {                  int tmp = a[j] ; a[j] = a[j+1] ;  a[j+1] = tmp;              }          }      }  }

冒泡排序算法的改进

对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。

6. 交换排序—快速排序(Quick Sort)

基本思想:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。

3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

算法的实现:

 递归实现:

void print(int a[], int n){      for(int j= 0; j<n; j++){          cout<<a[j] <<"  ";      }      cout<<endl;  }    void swap(int *a, int *b)  {      int tmp = *a;      *a = *b;      *b = tmp;  }    int partition(int a[], int low, int high)  {      int privotKey = a[low];                             //基准元素      while(low < high){                                   //从表的两端交替地向中间扫描          while(low = privotKey) --high;  //从high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端          swap(&a[low], &a[high]);          while(low < high  && a[low] <= privotKey ) ++low;          swap(&a[low], &a[high]);      }      print(a,10);      return low;  }      void quickSort(int a[], int low, int high){      if(low < high){          int privotLoc = partition(a,  low,  high);  //将表一分为二          quickSort(a,  low,  privotLoc -1);          //递归对低子表递归排序          quickSort(a,   privotLoc + 1, high);        //递归对高子表递归排序      }  }    int main(){      int a[10] = {3,1,5,7,2,4,9,6,10,8};      cout<<"初始值:";      print(a,10);      quickSort(a,0,9);      cout<<"结果:";      print(a,10);    }

分析:

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。

7. 归并排序(Merge Sort)

基本思想:

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

合并方法:

设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。

j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束//选取r[i]和r[j]较小的存入辅助数组rf
如果r[i]否则,rf[k]=r[j]; j++; k++; 转⑵//将尚未处理完的子表中元素存入rf
如果i如果j

//将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n]  void Merge(ElemType *r,ElemType *rf, int i, int m, int n)  {      int j,k;      for(j=m+1,k=i; i<=m && j <=n ; ++k){          if(r[j] < r[i]) rf[k] = r[j++];          else rf[k] = r[i++];      }      while(i <= m)  rf[k++] = r[i++];      while(j <= n)  rf[k++] = r[j++];  }

归并的迭代算法

1 个元素的表总是有序的。所以对n 个元素的待排序列,每个元素可看成1 个有序子表。对子表两两合并生成n/2个子表,所得子表除最后一个子表长度可能为1 外,其余子表长度均为2。再进行两两合并,直到生成n 个元素按关键码有序的表。

void print(int a[], int n){      for(int j= 0; j<n; j++){          cout<<a[j] <<"  ";      }      cout<<endl;  }    //将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n]  void Merge(ElemType *r,ElemType *rf, int i, int m, int n)  {      int j,k;      for(j=m+1,k=i; i<=m && j <=n ; ++k){          if(r[j] < r[i]) rf[k] = r[j++];          else rf[k] = r[i++];      }      while(i <= m)  rf[k++] = r[i++];      while(j <= n)  rf[k++] = r[j++];      print(rf,n+1);  }    void MergeSort(ElemType *r, ElemType *rf, int lenght)  {       int len = 1;      ElemType *q = r ;      ElemType *tmp ;      while(len < lenght) {          int s = len;          len = 2 * s ;          int i = 0;          while(i+ len <lenght){              Merge(q, rf,  i, i+ s-1, i+ len-1 ); //对等长的两个子表合并              i = i+ len;          }          if(i + s < lenght){              Merge(q, rf,  i, i+ s -1, lenght -1); //对不等长的两个子表合并          }          tmp = q; q = rf; rf = tmp; //交换q,rf,以保证下一趟归并时,仍从q 归并到rf      }  }      int main(){      int a[10] = {3,1,5,7,2,4,9,6,10,8};      int b[10];      MergeSort(a, b, 10);      print(b,10);      cout<<"结果:";      print(a,10);    }

两路归并的递归算法

void MSort(ElemType *r, ElemType *rf,int s, int t)  {       ElemType *rf2;      if(s==t) r[s] = rf[s];      else      {           int m=(s+t)/2;          /*平分*p 表*/          MSort(r, rf2, s, m);        /*递归地将p[s…m]归并为有序的p2[s…m]*/          MSort(r, rf2, m+1, t);      /*递归地将p[m+1…t]归并为有序的p2[m+1…t]*/          Merge(rf2, rf, s, m+1,t);   /*将p2[s…m]和p2[m+1…t]归并到p1[s…t]*/      }  }  void MergeSort_recursive(ElemType *r, ElemType *rf, int n)  {   /*对顺序表*p 作归并排序*/      MSort(r, rf,0, n-1);  }

更多PHP相关知识,请访问PHP中文网!

以上就是数据结构排序算法总结的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1433324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 09:04:53
下一篇 2025年12月17日 09:05:06

相关推荐

  • 总结CSS中的Margin属性

    CSS中margin属性总结 CSS中的margin属性用来设置元素的外边距,它可以控制元素与周围元素之间的间距。本文将对margin属性进行总结,并提供一些具体的代码示例供参考。 margin属性有四个值,分别表示元素上、右、下和左的外边距。可以使用以下几种方式来设置margin值: 单个值:设置…

    2025年12月24日
    000
  • CSS3 flex布局总结

    css3 flex布局总结 2009年,W3C 提出了一种新的方案—-Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持。 Flex 是 Flexible Box 的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。…

    2025年12月24日
    000
  • CSS的居中布局总结

    这次给大家带来CSS的居中布局总结,CSS居中布局的注意事项有哪些,下面就是实战案例,一起来看一下。 先来说几种简单的、人畜无害的居中方法 1. 把margin设为auto 具体来说就是把要居中的元素的margin-left和margin-right都设为auto,此方法只能进行水平的居中,且对浮动…

    2025年12月24日 好文分享
    000
  • 为什么HTML插入表格排序功能失效_JavaScript排序实现

    表格排序需JavaScript实现,因HTML无自动排序能力。1. 通过JavaScript监听表头点击事件,获取对应列数据并排序;2. 正确绑定事件到元素,利用cellIndex确定排序列;3. 根据数据类型转换内容,数字用减法比较,文本用localeCompare();4. 排序后使用appen…

    2025年12月23日
    000
  • HTML中关于盒模型的总结

    这次给大家带来html中关于盒模型的总结,html中关于盒模型的注意事项有哪些,下面就是实战案例,一起来看一下。 关于怪异盒模型和标准盒模型的对比   关于怪异盒模型盒标准盒模型之间的转换 相信看了这些案例你已经掌握了方法,更多精彩请关注创想鸟其它相关文章! 相关阅读: 怎样让按钮点击后出现“点”的…

    2025年12月21日
    000
  • HTML文本格式的知识总结

    这次给大家带来html文本格式的知识总结,使用html文本格式的知识总结的注意事项有哪些,下面就是实战案例,一起来看一下。 HTML 文本格式化标签 标签 描述 定义粗体文本 呈现为被强调的文本 定义斜体字 定义小号字 定义重要文本 定义下标字 定义上标字 定义插入字 定义删除字 通常标签 替换加粗…

    好文分享 2025年12月21日
    000
  • HTML段落的知识总结

    这次给大家带来html段落的知识总结,使用html段落的注意事项有哪些,下面就是实战案例,一起来看一下。 HTML 段落 段落是通过 标签定义的。 实例 This is a paragraph 立即学习“前端免费学习笔记(深入)”;This is another paragraph  提示:忘记使用…

    好文分享 2025年12月21日
    000
  • html中频繁用的标签总结

    这次给大家带来html中频繁用的标签总结,哪些是html中频繁用的标签,下面就是实战案例,一起来看一下。 内容详细标签: ~ 标题标签 格式化文本下划线(underline)斜体字(italics)引用,通常为斜体强调文本通常为斜体加重文本,通常为黑体设置字体、字体大小、颜色等字体变大和字体变小加删…

    好文分享 2025年12月21日
    000
  • 最全的CSS样式整理总结

    本文主要和分享最全面的css样式,很齐全,掌握这些样式肯定能完成一个很完美的css页面,需要的朋友参考下吧,希望能帮助到大家。 一 字体属性:(font)  大小 {font-size: x-large;}(特大)xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD  样式…

    好文分享 2025年12月21日
    000
  • 常用的HTML标签元素总结简介

    给大家收集整理了一些最常用的html标签元素,有需要的朋友可以保存一下,这些都是最常用的,几乎每一份网页都用得到的标签。标签是提供关于html文档的元数据。元数据不会显示在页面上,但是对于机器是可读的。它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务。 html…

    好文分享 2025年12月21日
    000
  • html表格知识总结

    要踏入程序员的大门,我们必会经过的路就是html,掌握基础的html才能更好的学习接下来的技术,那么今天我们就来全方面的分享一下html表格相关的知识。 1、 标记   a,基本格式 表格内容   b,table 标记的属性     width属性:表示表格的宽度,他的值可以是像素(px)也可以是父…

    好文分享 2025年12月21日
    000
  • html中关于头部标签的总结

      head 元素包含了所有的头部标签元素,可以添加在头部区域的元素标签为:   、、、、、、  下面将一一解释各标签的作用 立即学习“前端免费学习笔记(深入)”; 用于定义不同文档的标题 定义浏览器工具栏的标题 当网页添加至收藏夹,显示在收藏夹中的标题 显示在搜索引擎结果页面的标题 Dbsite企…

    2025年12月21日
    000
  • HTML中增强标记的用法总结

    近年来,超文本标识语言(HTML)得到了迅速拓展。为满足更多的需要,它增加了许多扩展功能。设计新颖、吸引人的网页已经越来越依赖java applet(小程序)、内嵌脚本、图文框、插件和其它扩展的HTML功能。这些扩展的HTML功能不仅可以对文本作进一步的格式化,而且可以嵌入程序、动画和其它交互式操作…

    好文分享 2025年12月21日
    000
  • html中不常用的标签总结

    介绍几个不常用的html标签 在HTML王国里,这里有很多子民,通常我们看到的是一些熟悉的面孔,而对于那些不熟悉的面孔你又了解多少呢,你知道它们的用法吗? 0、 标签 标签出现在HTML文档第一行上的信息,说明该文档的类型,是一个“标准概括化置标语言(SGML)”声明,不是元素。语法: 例子: 1、…

    好文分享 2025年12月21日
    000
  • html中关于Button.onclick的事件总结分享

    html中关于button.onclick的事件总结分享 关于web设计中的命名标准 #page#header #logo #sm (servicemenu) .regsiter .login #nav .menu .subMenu .search .sreachbtn(搜索按钮).sreachin…

    好文分享 2025年12月21日
    000
  • html中关于文本框样式的总结大全(收藏)

     输入框景背景透明: 鼠标划过输入框,输入框背景色变色:   输入字时输入框边框闪烁(边框为小方型): function borderColor(){if(self[‘oText’].style.borderColor==’red’){self[‘oText’].style.borderColor …

    好文分享 2025年12月21日
    000
  • html iframe使用的实战总结分享

    说在前面的话,iframe是可以做很多事情的。例如:a>通过iframe实现跨域;b>使用iframe解决ie6下select遮挡不住的问题c>通过iframe解决ajax的前进后退问题d>通过iframe实现异步上传。(easyui中form组件就是用的iframe,实现表…

    2025年12月21日 好文分享
    000
  • javascript中的排序算法有哪些_如何实现快速排序或归并排序

    JavaScript常用排序算法中,快速排序是高效O(n log n)的分治算法,选基准值划分数组并递归排序,原地实现但最坏O(n²),不稳定,适合无序数据。 JavaScript 中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。其中,快速排序和归并排序是两种高效、实…

    2025年12月21日
    000
  • 如何用JavaScript实现一个简单的排序算法_冒泡和快速排序如何编写?

    冒泡排序通过相邻元素比较交换使最大值逐轮上浮,最多n-1轮,可提前终止;快速排序采用分治法,选基准划分数组后递归排序左右子数组,核心为双指针分区。 冒泡排序和快速排序是两种经典排序算法,JavaScript 实现起来都不难,关键在于理解逻辑和边界处理。 冒泡排序:相邻比较,大数上浮 每次遍历把当前未…

    2025年12月21日
    000
  • 如何实现排序算法_javascript中数组排序方法有哪些?

    JavaScript数组sort()默认按字符串Unicode排序,数字排序需传入比较函数:升序用a-b,降序用b-a,对象按属性排序用localeCompare或链式判断;原地排序需拷贝数组避免修改原数据。 JavaScript 中数组排序主要靠 sort() 方法,但它默认按字符串 Unicod…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信