排序系列--直接插入排序

根据在排序过程中的主要操作,可分为四大类:

插入排序类:直接插入排序,希尔排序

选择排序类:简单选择排序,堆排序

交换排序类:冒泡排序,快速排序

归并排序类:归并排序

下面来说下他们的思想,就知道为什么事这四大类了:

插入排序类:都是对已经存在的记录进行移动,然后将某个记录插入相应的位置。

直接插入排序:是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。(直接插入排序,是对每个要插入的元素,都进行比较,觉得插入到某个位置)

#include <iostream>
using namespace std;
#define MAXSIZE 20

void insertSort(int a[],int len)
{
 int i;
 int j;
 int tmp;

 for (i=2; i<=len; i++)
 {
     if (a[i] < a[i-1])
  {
       tmp = a[i];   //tmp其实也就是哨兵,可以为a[0]
       for (j=i-1; j>0&&a[j]>tmp ;j--) //这里要标明j>0,如序列为5 1 2 ,如果数组初始化为{0},则1>0,会终止。程序没有初始化为0,所以,需要加j>0,保证程序正确。从这里可以看出,初始化多么的重要。要符合编程规范!
       {
           a[j+1]=a[j];
       }
      a[j+1]=tmp;

  }
  
 }
 for (i=1; i<=len; i++)
 {
     cout<<a[i]<<endl;
 }
   
}

int main()
{
    int arr[MAXSIZE];
    int n;
    int i;
 
 cout<<"输入数据的个数"<<endl;
 cin>>n;
 cout<<"输入数据:"<<endl;
 for(i=1; i<=n; i++)
 {
    cin>> arr[i];
 }
  insertSort(arr, n);
  return 0;
}

 直接插入排序是希尔排序的一个特例。因为,在使用直接插入排序,一般是要求,记录本身是基本有序的,还有就是记录数比较少,直接插入的优势才比较明显。

那么希尔排序的思想是根据这些要求提出来的。将大量的数据进行分组,分割成若干个子序列,此时每个子序列中待排记录数就比较少。采用的分割策略就是,将相距某个“增量”的记录组成一个子序列。对这些中的子序列中记录进行排序。

所谓基本有序,就是小的关键字基本在前面,大的关键字基本在后面。下节将讲述希尔排序的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值