您好,欢迎来到爱学范文!

当前位置:爱学范文网>>工作范文>>工作总结范文>>各种排序方法复杂度总结

各种排序方法复杂度总结

标签:时间:

各种排序方法复杂度总结

在C中,排序算法是最基本最常用的算法,不同的排序算法在不同的场景或应用中会有不同的表现,接下来小编搜集了各种排序方法复杂度总结,欢迎查看。

一、冒泡排序

主要思路是:

通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。

代码实现

void bubble_sort(int arr[], int len)

{

for (int i = 0; i < len — 1; i++)

{

for (int j = len — 1; j >= i; j——)

{

if (arr[j] < arr[j — 1])

{

int temp = arr[j];

arr[j] = arr[j — 1];

arr[j — 1] = temp;

}

}

}

}

冒泡排序改进1:

在某次遍历中,如果没有数据交换,说明整个数组已经有序,因此通过设置标志位来记录此次遍历有无数据交换就可以判断是否要继续循环。

冒泡排序改进2:

记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序。因此设置标志位记录每次遍历中最后发生数据交换的位置可以确定下次循环的范围。

二、直接插入排序

主要思路是:

每次将一个待排序的'数组元素,插入到前面已排序的序列中这个元素应该在的位置,直到全部数据插入完成。类似扑克牌洗牌过程。

代码实现

void _sort(int arr[], int len)

{

for (int i = 1; i < len; i ++)

{

int j = i — 1;

int k = arr[i];

while (j > —1 && k < arr[j] )

{

arr[j + 1] = arr[j];

j ——;

}

arr[j + 1] = k;

}

}

三、直接选择排序

主要思路是:

数组分成有序区和无序区,初始时整个数组都是无序区,每次遍历都从无序区选择一个最小的元素直接放在有序区最后,直到排序完成。

代码实现

void select_sort(int arr[], int len)

{

for (int i = 0; i < len; i++)

{

int index = i;

for (int j = i + 1; j < len; j++)

{

if (arr[j] < arr[index])

index = j;

}

if (index != i)

{

int temp = arr[i];

arr[i] = arr[index];

arr[index] = temp;

}

}

}

四、快速排序

主要思路是:

“挖坑填数 + 分治法”,首先令i = L;j = R;将a[i]挖出形成打一个坑,称a[i]为基准数。然后j——从后向前找到一个比基准数小的数,挖出来填到a[i]的坑中,这样a[j]就形成了一个新的坑,再i++从前向后找到一个比基准数大的数填到a[j]坑中。重复进行这种挖坑填数,直到i = j。这时a[i]形成了一个新的坑,将基数填到a[i]坑中,这样i之前的数都比基准数小,i之后的数都比基准数大。因此将数组分成两部分再分别重复上述步骤就完成了排序。

代码实现

void quick_sort(int arr[], int left, int right)

{

if (left < right)

{

int i = left, j = right, target = arr[left];

while (i < j)

{

while (i < j && arr[j] > target)

j——;

if (i < j)

arr[i++] = arr[j];

while (i < j && arr[i] < target)

i++;

if (i < j)

arr[j] = arr[i];

}

arr[i] = target;

quick_sort(arr, left, i — 1);

quick_sort(arr, i + 1, right);

}

}

五、希尔排序

主要思路是:

先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。由于希尔排序是对相隔若干距离的数据进行直接插入排序,因此可以形象的称希尔排序为“跳着插”。

六、归并排序

主要思路是:

当一个数组左边有序,右边也有序,那合并这两个有序数组就完成了排序。如何让左右两边有序了?用递归!这样递归下去,合并上来就是归并排序。

代码实现

void merge(int arr[], int temp_arr[], int start_index, int mid_index, int end_index)

{

int i = start_index, j = mid_index + 1;

int k = 0;

while (i < mid_index + 1 && j < end_index + 1)

{

if (arr[i] > arr[j])

temp_arr[k++] = arr[j++];

else

temp_arr[k++] = arr[i++];

}

while (i < mid_index + 1)

{

temp_arr[k++] = arr[i++];

}

while (j < end_index + 1)

temp_arr[k++] = arr[j++];

for (i = 0, j = start_index; j < end_index + 1; i ++, j ++)

arr[j] = temp_arr[i];

}

void merge_sort(int arr[], int temp_arr[], int start_index, int end_index)

{

if (start_index < end_index)

{

int mid_index = (start_index + end_index) / 2;

merge_sort(arr, temp_arr, start_index, mid_index);

merge_sort(arr, temp_arr, mid_index + 1, end_index);

merge(arr, temp_arr, start_index, mid_index, end_index);

}

}

七、堆排序

堆排序的难点就在于堆的的插入和删除。

堆的插入就是——每次插入都是将新数据放在数组最后,而从这个新数据的父结点到根结点必定是一个有序的数列,因此只要将这个新数据插入到这个有序数列中即可。

堆的删除就是——堆的删除就是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于从根结点开始将一个数据在有序数列中进行“下沉”。

因此,堆的插入和删除非常类似直接插入排序,只不是在二叉树上进行插入过程。所以可以将堆排序形容为“树上插”。

想了解更多工作范文的资讯,请访问:工作总结范文
下载文档

看过《各种排序方法复杂度总结》的人还看了以下文章

延伸阅读

生日藏头诗是以生日话题为主的一种祝福类诗题材,属于藏头诗的一种,就是以生日快乐,或祝福语句等为藏头内容,通篇为赞颂爱情或者友谊用的一种诗歌。下面是小编为大家整理的关于生日祝福的藏头诗,欢迎借鉴。一、生

老婆是家里的顶梁柱,是家庭不可缺少的一员,犯了错需要给老婆写一份保证书。下面是小编整理的写给老婆的保证书范文5篇,欢迎大家阅读分享借鉴,希望对大家有所帮助。更多保证书相关内容推荐↓↓↓学习保证书范本5

新郎父母婚礼贺词范文1  各位嘉宾:  大家好!今天是我儿子××和××小姐结婚的大喜日子,我感到非常高兴和荣幸。高兴的是这对新人今天携手共同走进了他们婚礼的殿堂,开始了他们新的人生,我们也算完成了一个

我极富敬业精神、积极开朗、乐观向上,有很强的沟通能力和团队协作能力。下面是小编整理的范文,欢迎查阅!工作自我鉴定范文1多年的工作经验使我较为熟悉行政总务管理、人力资源管理理论,具有招聘和内训的

个人学习总结个人学习总结(一):个人学习总结范文为提高自身的管理专业技能,培养创新经营和现代管理意识,促使在工作中进一步更新观念、理清思路。我从XX年10月开始参加了杭州年代学校开设的国际

时光飞逝,弹指之间,20&times;&times;年已接近尾声,回首过去的一年,内心不禁感慨万千时间如梭,又将跨过一个年度之坎。作为基层管理者,成本是公司的关键之一,对成本管理水平的要求应不断提升,

急诊科院感年度工作总结范文(精选18篇)时间过得真快,一段时间的工作已经告一段落了,回顾这段时间中有什么值得分享的成绩呢?将过去的成绩汇集成一份工作总结吧。我们该怎么去写工作总结呢?下面是小编为大家收集

光阴的迅速,一眨眼就过去了,成绩已属于过去,新一轮的工作即将来临,写好计划才不会让我们努力的时候迷失方向哦。计划书写有哪些要求呢?我们怎样才能写好一篇计划呢?那么下面我就给大家讲一讲计划书怎么写才比较

下面是小编为大家整理的公司上半年党风廉政建设工作报告(全文),供大家参考。公司2020年上半年党风廉政建设工作报告2020年上半年,为有效贯彻落实上级党委部署和要求,以******新时代中国特色社会主

建筑工程分包合同(20篇)建筑工程分包合同篇1总承包方:分包方:第一条工程名称____。(指分包部分之工程名称)第二条工程地点____。第三条工程范围____。(可用列附表办法)第四条质量标准__