logo头像

勤求古训,博采众方

常见的排序算法介绍与分析

本文于 2927 天之前发表,文中内容可能已经过时。

算法是一个计算机开发者的基本功之一,也是面试时经常喜欢问或者变着法子问解题思路的一门基础学科,本文主要介绍面试经常考到的排序算法。

常见的几种排序算法介绍

插入排序:

  • 直接插入排序
  • 折半插入排序
  • 希尔排序(增量排序)

交换排序:

  • 冒泡排序
  • 快速排序

选择排序:

  • 简单选择排序
  • 推排序

面试经常考到的排序算法介绍

插入排序中的希尔排序

希尔排序又叫增量排序,其实字面直接理解每次根据某个值逐渐增大值排序,那这个值具体指的是什么呢?又是以什么方式增量的呢?赶紧来看看吧。。。

概念 :希尔排序是把记录按下标一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

以上概念中可得知的增量其实是记录的间隔,增量的作用通过下标来按间隔进行分组,增量减至1,排序结束。

比如说:1 5 -7 9 10 23 45 增量设置为4,那么组数为4组

**1组:1 10 **

**2组:5 23 **

**3组:-7 45 **

**4组:9 **

下面通过图直观了解下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

//排序数组记录
funtion xiErSort(Arrary data){
//设置下标与增量 增量即是组数
var pos,increase=data.length;
//increase为1排序结束
while(increase==1){
for(var i=0;i<increase;i++){
//增量减小
increase=increase/2;
//设置组内下标,临时变量
var j,temp=data[i];
//按增量大小间隔进行分组同时进行直接插入排序
//大于记录长度则分组结束
for(j=i;j<data.length;j+=increase){
//若j+increase位置上的数据比前一个来的小,则前一位位置插入j+increase位置上的数据
if(data[j+increase]<temp){
data[j]=data[j+increase];
}
}
//设置每一组最后位置的数据
data[j-increase]= temp;
}
}
}

交换排序的冒泡排序

冒泡排序是现实中经常遇到的,也是容易理解的一种交换算法,For Example:班级上体育课先让同学们自己排,然后老师按身高从低到高再排队伍

1
2
3
4
5
6
7
8
9
10
for(int i=0;i<data.length;i++)
for(int j=i;j<data.length;j++){
//从小到大递增
if(data[j]>data[j+1]){
temp=data[j+1];
data[j+1]=data[j];
data[j]=temp;
}
}

交换排序的快速排序