数据结构面试之十——排序1(直接插入、希尔、冒泡、直接选择排序)

简介: 直接插入、希尔、冒泡、直接选择排序

题注:《面试宝典》有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。

数据结构面试之十——排序1(直接插入、希尔、冒泡、直接选择排序)
1.直接插入排序

【算法思想】:每次将一个待排序的元素,插入到前面已经排序的子序列中,直到全部元素插入完毕为止。

【算法实现】:

//最简实现排序[交换实现].

template <class T>
void directInsertSort(T arr[],int N)
{
       inti;
       intj;
       for( i = 1; i < N; i++)
       {
              for(j= i-1; j >= 0 && arr[j+1] < arr[j];j--)
              {
                     swap(arr[j+1],arr[j]);
              }//endfor
       }//endfor
}

//直接插入排序[移动版本]

template <class T>
void directInsertSort(T arr[], int N)
{
       inti;
       intj;
       for( i = 1; i < N; i++)
       {
              inttemp = arr[i];
              for(j = i-1; j >= 0 && temp < arr[j]; j--)
              {
                     arr[j+1]= arr[j];  //后移动
              }
              arr[j+1]= temp;        //找到插入的位置.
       }
}
2.希尔排序

【算法思想】:将待排序的序列按照步长划分子序列,对子序列进行直接插入排序,然后递减步长直至为1(最小步长),这样整个序列就会基本有序,然后进行最后一次直接插入排序即可。

【算法实现】:

template<class T>
void ShellSort(T arr[], int N)
{
       inti;
       intj;
       intstep;
       for( step = N/2; step > 0; step/=2)
       {
              for(i= step; i < N; i++) //注意此处递增的步长为1,依次比较!
              {
                     for(j= i-step; j >=0 && arr[j+step] < arr[j]; j-=step)
                     {
                            swap(arr[j+step],arr[j]);
                     }//endfor j
              }//endfor i
       }//endfor step
}

希尔排序,可以看做是直接插入排序的改进算法,在直接插入排序的基础上多了外层循环,依次递减步长,最终完成排序。

 

3. 冒泡排序

【算法思想】:1)将待排序的序列元素之间两两进行比较,如果第一个元素大于第二个元素,则进行交换;2)这样经过一趟排序之后,确保值最大的元素在最底部;3)排序完一次后N-1,重复1),2)知道N==0为止。

【算法实现】:

//经典冒泡

template<typename T>
void BubuleSort(T a[], int N)
{
       inti,j;
       for(i= 0; i < N; i++)
       {
              for(j= 0; j < N-i-1; j++)
              {
                     if(a[j]> a[j+1])
                     {
                            swap(a[j],a[j+1]);
                     }//endif j
              }//endfor j
       }//endfor i
}

//改进+是否交换标识

template<typename T>
void BubuleSort(T a[], int N)
{
       inti,j;
       boolbExchange = true;         //初始设定为true
       for(i= 0; i < N && bExchange; i++)
       {
              bExchange= false;        //进入循环则设定为false
              for(j= 0; j < N-i-1; j++)
              {
                     if(a[j]> a[j+1])
                     {
                            swap(a[j],a[j+1]);
                            bExchange = true;//存在交换则变为true.
                     }//endif j
              }//endfor j
       }//endfor i
}

 

4. 选择排序

【算法思想】:同直接插入排序,将元素分为有序区和无序区。所不同的是,直接插入排序是将无序区域中第一个元素插入到有序区域以形成更大的有序区;而选择排序是从无序区域中选择最小的元素放入有序区的最后。

【算法实现】:

template <class T>
void SelectSort(T arr[], int N)
{
       intminPos;
       for(int i = 0; i < N; i++)
       {
              minPos= i;
              for(intj=i+1; j<N; j++)
              {
                     if(arr[j]< arr[minPos])
                     {
                            minPos= j;
                     }//endif
              }//endfor
              if(minPos!= i)
              {
                     swap(arr[minPos],arr[i]);//交换
              }
       }
}

作者:铭毅天下
来源:CSDN
原文:https://blog.csdn.net/laoyang360/article/details/7944448
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
9月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
436 3
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
1019 29
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
426 10
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
304 10
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
341 7
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
204 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
搜索推荐 C++
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(一)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
218 5
|
搜索推荐 索引
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(二)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
233 4
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
221 1
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
341 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。