排序分类+直接插入排序

一、排序的分类:

稳定排序与不稳定排序:

假设 Ri = Rj ,且排序前序列中 Ri 领先于 Rj ;
若在排序后的序列中 Ri 仍领先于 Rj ,则称排序方法是稳定的。

若在排序后的序列中 Rj 仍领先于 Ri ,则称排序方法是不稳定的。

例:序列   3    15     8     8     6     9
若排序后得   3     6      8     8     9    15         稳定的

若排序后得   3     6      8     8     9    15         不稳定的


内排和外排:

根据排序过程中待排序记录是否全部放置在内存中,排序分为内排和外排。
内部排序: 指的是待排序记录存放在计算机随机存储器中进行的排序过程。
外部排序: 指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。

二、排序算法的性能分析:

算法的复杂性:体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。

辅助空间:辅助空间是评价排序算法的一个重要指标,辅助空间是指除了存放待排序资源之外,执行算法所需要的其他存储空间。

时间复杂度:简单的说就是程序循环执行的总的次数。算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。时间复杂度常用大O符号表述,即O(f(n))。

三、按照排序过程中所依据的原则的不同可以分类为:

►插入排序

直接插入排序   希尔排序

►交换排序

冒泡排序   快速排序

►选择排序

简单选择排序   堆排序

►归并排序

►基数排序

四、直接插入排序:

稳定性:稳定
时间复杂度: O(n^2)

(1)初始数据正序,总比较次数:n-1

(2)初始数据逆序,总比较次数:(n2+n-1)/2=O(n2)

(3)初始数据无序,第i趟平均比较次数(i+1)/2,总次数为:(n2+3n)/4=O(n2)

(4)可见,原始数据越趋向正序,比较次数和移动次数越少

#include <stdio.h>


void InsertSort(int par_array[], int array_size)
{
int i, j;
int temp;


for (i = 1; i < array_size; i++)
{
temp = par_array[i];


for (j = i - 1; j >= 0; j--)
{
if (temp < par_array[j])
{
par_array[j + 1] = par_array[j];
}
else
{
break;
}
}
par_array[j + 1] = temp;
}
}


int main()
{
int i = 0;
int a[] = {3, 5, 2, 1, 9, 0, 6, 4, 7, 8};
int length = sizeof(a) / sizeof(a[0]);


InsertSort(a, length);


for (i = 0; i < length; i++)
{
printf("%d ", a[i]);
}
printf("\n");


return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值