天天看点

排序算法部分知识点小结

排序算法部分知识点小结

…………………………………………………………………………………………………

开发工具与关键技术:《数据结构与算法》

作者:林敏静

撰写时间:2020年4月26日

…………………………………………………………………………………………………

前不久结束《数据结构与算法》的网络课堂学习,我根据课堂学习的知识点与课后查找资料拓展知识点写了一篇排序算法里面的直接插入排序、快速排序与选择排序的知识小结,如下:

  1. 直接插入排序:

◇基本思路:每次从无序表中取出第一个元素,把它插入到有序表的适当位置,使有序表仍然有序,每一趟都是将一个待排序记录,按其关键字的大小,插入到已经排好序的一组记录的适当位置上,直到所有待排序记录都插入到有序段中,需要进行n-1趟。

◇直接插入算法描述:

void InsertSort(RecData
r,int n)

/*对记录数组r[1..n]做直接插入排序*/

{int i,j;

 for(i=2;i<=n;i++)

   { r[0]=r[i];/*r[i]存入监视哨r[0]*/

    j=i-1;

 while(r[0].key<r[j].key)

{ r[j+1]=r[j];

/*将关键字大于r[i].key的记录后移*/

j--;

}

    r[j+1]=r[0];/*r[i]插入到正确的位置*/

}

}/*InsertSort*/

           

◇效率分析:直接插入排序只需要一个元素的辅助空间,时间复杂度为O(n2),空间复杂度为O(1),直接插入算法的元素移动是顺序的,是稳定的算法,适用于对排序元素较少,且基本有序的数据元素排序。

  1. 快速排序:

◇基本思路:从待排序序列的n个记录中任取一个记录Ri作为基准记录,所有关键字比Ri小的的元素放在Ri的前面,比Ri大的放在它后面,形成左右两个子表,对各个子表重新选择中心元素并依次按照规则调整(递归思想),直到每个子表的元素只剩一个,此时就得到n个记录的有序序列。

◇快速排序算法描述:

int QuickPass(RecData,int,int j)

/*对序列r[i..j]进行一趟快速排序*/

{r[0]=r[i];/*选择第i个记录做基准记录*/

 While(i<j)

   { while(i<j&&r[j].key>=r[0].key)

        j--;/*j从右向左找小于r[0].key的记录*/

        if(i<j)

{ 
r[i]=r[j];/*找到小于r[0].key的记录,交换*/

   i++;

}

while(i<j&&r[i].key<r[0].key)

 
i++;/*i从左向右找大于r[0].key的记录*/

if(i<j)

   { r[j]=r[i];/*找到大于r[0].key的记录,交换*/

     j--;

}

}

r[i]=r[0];

return i;

}/*QuickPass*/

           

◇快速排序的递归算法描述:

void QuickSort(RecData 
r,int
l,int h)

{ int k;

  if(l<h)

      {
k=QuickPass(r,l,h);/*对r[l..h]划分*/

        QuickSort(r,l,k-1);/*对左区间递归排序*/

        QuickSort(r,k+1,h);/*对右区间递归排序*/

}

}/*QuickSort*/

           

◇效率分析:快速排序算法的时间效率取决于划分子序列的次数,对于有n个记录的序列进行划分,共需n-1次关键字的比较,在最好情况下,假设每次划分得到两个大致等长的记录子序列,时间复杂度为O(log₂n),快速排序是一种不稳定的排序方法。

  1. 选择排序:

◇基本思路:每一趟从待排序记录中选出关键字最小的记录,按顺序放到已排好序的子序列中,直到全部记录排序完毕,选择排序有两种:直接选择排序和堆排序。

◇直接选择排序的基本思路:假设待排序序列有n个记录(R₁,R₂,…,Rn),先从n个记录中选出关键字最小的记录Rk,将该记录与第1个记录交换位置,完成第一趟排序,然后从剩下的n-1个记录中再找出一个关键字,最小的记录与第二个记录交换位置,依次反复对n个记录,经过n-1趟排序即可得到有序序列。

◇直接选择排序算法:

void SelectSort(RecData,int n)

{ int I,j,k;

  for(i=1;i<=n-1;++i)

  {

  
k=i;

  
for(j=i+1;j<=n;++j)

      if(r[j].key<r[k].key)/*选出关键字最小的记录*/

      k=j;/*k保存当前找到的最小关键字的记录位置*/

  if(k!=i)

{

  交换r[k]和r[i]

}

}

}/*SelectSort*/

           

在直接选择排序过程中需要的关键字的比较次数与序列原始顺序无关,当i=1时,(外循环执行第一次),内循环比较n-1次,i=2时,内循环比较n-2次,依次类推,算法的总比较次数为(1+2+3…+n-1)=n(n-1)/2。因此,直接选择排序的时间复杂度为O(N²),由于只用一个变量做辅助空间,故空间复杂度为O(1),直接选择排序是不稳定的。

那么本篇文章就分享到这里啦!若有不足的地方,还望请多多指教!