【BigHereo 49】---DataStructure---排序算法(七)

本文详细介绍七种常用的排序算法,包括插入排序(直接插入、Shell排序)、选择排序(直接选择、堆排序)、交换排序(冒泡排序、快速排序)及归并排序。文中不仅解释了各种排序算法的概念和稳定性,还提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



DataStructure---排序算法(七)


 


一,【前言】


     排序算法是所有AI, 人工智能等在IT行业中要成为大师的必修之功.排序算法简单的说就是多数据结构的一个操作,可以说出一种函数或者就说是一种解决问的方法.


  1,常用的排序算法有哪些?


   2,插入排序分为哪些?


   3,选择排序稳定吗?


   4,shell排序和归并排序有什么关联吗?


   5, 这些排序算法都怎么进行选择?


 

二,【详情】


 1,常用的排序算法有哪些?

解答: 常用的有七种,可以分为四类, 插入(直接插入, shell排序), 选择(直接选择,堆排序), 交换(冒泡, 快速)和归并排序.


  2,插入排序分为哪些?

解答: 插入排序可以分为四种, 直接插入,shell排序, 二分(折半)排序和表插入排序; 常用的是直接插入和shell排序.

 

  3,选择排序稳定吗?

解答: 不稳定. 什么是稳定? 如果有两个相同数字在排序之后,他们的排序前后位置不变成为该种排序是稳定的.

不稳定的有: 快速选择shell.---一共就四种: 快速排序, 选择(直接选,堆排序)和shell.

 

  4,shell排序和归并排序有什么关联吗?

解答: shell 和归并都是先两个两个进行 对比,如果是要从小到大, 他们顺序不对就交换.

Shell是中间空几个的两个比较; 而 归并是相邻的两个进行比较, 之后进行四个比较一致归并.

 

  5, 这些排序算法都怎么进行选择?

解答: 怎么选择?

     (1)序列基本有序时,插入和交换比较好

     (2)待排记录数量较大, 选择排序比较好


 

  6,直接插入的代码怎么写?

      

voidStraightInsertSort(List R, int n)
{
   int i,j;
   for(i=2;i<=n; i++)
  {
    R[0]=R[i]; j=i-1;  //第i个记录复制为岗哨
    while(R[0].key < R[j].key){ R[j+1]=R[j];j--;  }
     R[j+1]=R[0];
   }
}
 


  7,什么是直接选择?

解答: 是什么?

 (1)从未排序数中选择一个小的往前放

 (2)选出同时,还要进行交换


 

  8,直接选择代码怎么写?



voidSelectSort(ListR,intn)
{
  int min i, j;
  for(i=1; i<= n-1; i++)
   { min=i;
      for(j=i+1;j<n; j++)
        if(R[j].key< R[min].key)  min=j;
        if(min!=i) swap(R[min], R[i]);
   }
}
 

 

  9,堆排序有哪两种?

解答:

(1)最大堆

         最大的在最前面

(2)最小堆

         最小的在最前面

 


  10,用代码怎么建立初始堆?



代码怎写?        

 void HeapSort(List R)
{
  int i;
  for (i=n/2; i>= 1;i--) sift( R, i, n);
  for (i=n; i>=2;i--) { swap(R[1], R[i]);sift(R,1,i-1);}
}
 

    

  void sift(List R, int k ,int m)
{
  int i,j,x; List t;  i=k;  j=2*j; x=R[k].key;  t=R[k];
  while(j<=m) {
     if(j<m)&& (R[j].key>R[j+1].key)  j++;
     if(x<R[j].key) break;
     else{R[i]=R[j]; i=j; j=2*i;}
   }
  R[i]=t;
}
 


11,什么是冒泡排序?

解答: 概念

         从小到大:相邻相关进行比较,大的就往右交换,

一直重复这样到最后,  一次选择最大的

 


12,冒泡排序怎么用代码表示?

 

voidBubbleSort(List R, int n)
{
   int, j , temp, endsort;
   for(i=1; i<=n-1; i++)
  {
   endsort=0;
   for(j=1; j<=n-i-1; j++)
      {
     if(R[j].key >R[j+1].key)
       {
         temp= R[j];R[j]=R[j+1]; R[j+1]=temp; endsort=1;
        }
      }
   if(endsort==0) break;
  }
}



 13, 什么是快速排序?

解答: 是什么?

         选一个记录值作为基准(一般第一个),小的放左边,大的放右边

         怎么排?

                   拿基准和最右边 i 比较,小于基准进行交换,否则进行i-- 比较; 直至最后

 

 

 14,快速排序怎么用代码写出来?



//递归快速
         void QuickSort(List r, int lovw , inthigh
  if(low< high){
   temp=QuickPartition(R,low,high);
   QuickSort(r,low, temp-1);
   QuickSort(R, temp+1, high);}
}


一趟排序
         int QuickPartition(List R, int Low,inthigh){
  x=R[low];
  while(low <high){
     while((low< hig)&&(R[high].key>=x.key))  high--;  R[low]=R[high];     
     while ((low<high)&&(R{[ow].key<=x.key))  low++; R[high]=R[low];
  }
   R[low]=x; return low;
}
 



 15,归并排序用代码怎么表示?

 

 

 

三,【小结】                                          

 

 

 

 

 

 

 

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值