直接插入排序
- 格式:doc
- 大小:25.00 KB
- 文档页数:3
#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<time.h>#define MAXSIZE 100/***************定义和初始化顺序表************************/ typedef int DataType;typedef struct node {DataType data[MAXSIZE];int length;}SeqList,*PseqList;//定义一个顺序表。
PseqList Init_SeqList(void){PseqList PL;PL=(PseqList)malloc(sizeof(SeqList));if(PL)PL->length=0;return(PL);}//顺序表的初始化./*********************直接插入排序**********************/ void StraightInsertSort(SeqList *s){int i,j;for(i=2;i<s->length;i++){s->data[0]=s->data[i];for(j=i-1;s->data[0]<s->data[j];j--){s->data[j+1]=s->data[j];}s->data[j+1]=s->data[0];}}/*******************快速排序************************/int QuickSort1(SeqList *s,int low,int high){s->data[0]=s->data[low];while(low<high){while(low<high&&s->data[high]>=s->data[0])high--;s->data[low]=s->data[high];while(low<high&&s->data[low]<=s->data[0])low++;s->data[high]=s->data[low];}s->data[low]=s->data[0];return low;}void QuickSort(PseqList s,int low,int high){int m;if(low<high){m=QuickSort1(s,low,high);QuickSort(s,low,m-1);QuickSort(s,m+1,high);}}/******************大根堆排序************************/ void HeapAdjust(SeqList *s,int n,int m){int i,j;s->data[0]=s->data[n];i=n;for(j=2*i;j<=m;j=j*2){if(j<m&&s->data[j]<s->data[j+1])j++;if(s->data[0]>s->data[j]) break;s->data[i]=s->data[j];i=j;}s->data[i]=s->data[0];}void HeapSort(SeqList *s){int i;for(i=s->length/2;i>0;i--)HeapAdjust(s,i,s->length-1);for(i=s->length-1;i>1;i--){s->data[0]=s->data[1];s->data[1]=s->data[i];s->data[i]=s->data[0];HeapAdjust(s,1,i-1);}}/*****************归并排序************************/ void Merge(DataType r[],DataType rf[],int u,int v,int t){int i,j,k;for(i=u,j=v+1,k=u;i<=v&&j<=t;k++){if(r[i]<=r[j]){rf[k]=r[i];i++;}else{rf[k]=r[j];j++;}}while(i<=v) rf[k++]=r[i++];while(j<=t) rf[k++]=r[j++];}void MSort(DataType p[],DataType p1[],int n,int t){int m;DataType p2[MAXSIZE+1];if(n==t)p1[n]=p[n];else{m=(n+t)/2;MSort(p,p2,n,m);MSort(p,p2,m+1,t);Merge(p2,p1,n,m,t);}}void MergeSort(PseqList s){MSort(s->data,s->data,1,s->length-1);}/********************主函数*************************/ void main(){PseqList p;int i,n=0;srand((unsigned)time(NULL));p=Init_SeqList();for(i=1;i<=20;i++){p->data[i]=rand()%20+1;}p->length=i;printf("输出原序列:\n");for(i=1;i<p->length;i++) printf("%3d",p->data[i]);while(n==0||n==1||n==2||n==3||n==4){printf("\n请选择:1.直接插入排序;2.快速排序;3.大根堆排序;4.归并排序;其它退出\n");n=0;scanf("%d",&n);switch(n){case 1:StraightInsertSort(p);printf("输出直接插入排序后序列:\n");break;case 2:QuickSort(p,1,p->length-1);printf("输出快速排序序列:\n");break;case 3:HeapSort(p);printf("输出大根堆排序序列:\n");break;case 4:MergeSort(p);printf("输出归并排序序列:\n");break;default:printf("******error!*******\n");return;}for(i=1;i<p->length;i++) printf("%3d",p->data[i]);printf("\n");}}。
c#实现的⼏种排序⽅法1.经典排序算法 – 插⼊排序Insertion sort插⼊排序就是每⼀步都将⼀个待排数据按其⼤⼩插⼊到已经排序的数据中的适当位置,直到全部插⼊完毕。
插⼊排序⽅法分直接插⼊排序和折半插⼊排序两种,这⾥只介绍直接插⼊排序,折半插⼊排序留到“查找”内容中进⾏。
图1演⽰了对4个元素进⾏直接插⼊排序的过程,共需要(a),(b),(c)三次插⼊。
public void Sort(int[] arr){for (int i = 1; i < arr.Length; i++){int t = arr[i];int j = i;while ((j > 0) && (arr[j - 1] > t)){arr[j] = arr[j - 1];//交换顺序--j;}arr[j] = t;}}折半排序算法是对直接插⼊算法的⼀种优化,优化的核⼼是:通过折半查看有序数组中间位置的数值(a)与待插⼊的数值(temp)的⼤⼩,如果a>=temp,则转向折半的左区间继续折半查找;如果a<temp,则转向折半后的右区间继续折半查找。
直到左右下标相同时,此时折半的下标也指向相同的位置,再做最后⼀次循环,最终的结果是:左右下标相差1,并且原来左侧的下标指向⼤于temp的位置,原来右侧的下标指向了⼩于temp的位置,即:array[biggerIndex] < temp < array[smallerIndex]。
//折半排序算法(传递待排数组名,即:数组的地址。
故形参数组的各种操作反应到实参数组上)private static void BinaryInsertionSortFunction(int[] array){try{int smallerIndex = 0; //记录有序数组的起始位置int biggerIndex = 0; //记录有序数组的终⽌位置int midIndex = 0; //记录获取有序数组的中间位置(折半法的关键:折半的位置)int temp; //记录带排的数值for (int i = 1; i < array.Length; i++) //循环向有序数组中插⼊数值(i从1开始,因为操作的是同⼀个数组){temp = array[i]; //记录待插⼊有序数组的数值biggerIndex = i - 1;//当smallerIndex==biggerIndex时,进⼊最后⼀次循环:smallerIndex指向⼤于temp的数组位置,biggerIndex指向⼩于temp的数组位置while (smallerIndex <= biggerIndex){midIndex = (smallerIndex + biggerIndex) / 2; //确定折半的位置if(array[midIndex] >= temp) //折半位置的数值 >= temp{biggerIndex = midIndex - 1; //biggerIndex以midIndex为基础向前移动⼀位}else{smallerIndex = midIndex + 1; //smallerIndex以midIndex为基础向后移动⼀位}}for (int j = i - 1; j >biggerIndex; j--) //将有序数组中⼤于temp的数值分别向后移动⼀位{array[j + 1] = array[j]; //}array[biggerIndex + 1] = temp; //将temp插⼊biggerIndex + 1,因为此时array[biggerIndex]<temp<array[smallerIndex]}}catch (Exception ex){ }}2. //选择排序public static void SelectionSort(int[] num){int min, temp;for (int i = 0; i < num.Length-1; i++){min = i;for (int j =i+1; j < num.Length; j++){if (num[j] < num[min]){min = j;}}temp = num[i];num[i] = num[min];num[min] = temp;}}3. //冒泡排序(Bubble Sort)的基本思想是:将相邻的记录的关键码进⾏⽐较,若前⾯记录的关键码⼤于后⾯记录的关键码,则将它们交换,否则不交换。
当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。
快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;1. 插入排序—直接插入排序(Straight Insertion Sort)基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。
即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
直接插入排序示例:如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
算法的实现:效率:时间复杂度:O(n^2).其他的插入排序有二分插入排序,2-路插入排序。
2. 插入排序—希尔排序(Shell`s Sort)希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进。
希尔排序又叫缩小增量排序基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
操作方法:1.选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;2.按增量序列个数k,对序列进行k 趟排序;3.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。
仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
希尔排序的示例:算法实现:我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 .....1} n为要排序数的个数即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
插入排序的基本概念插入排序是一种简单直观的排序算法,它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序的时间复杂度为O(n^2),但在小规模数据时表现优异,且稳定性较好。
一、基本思想插入排序将待排序数组分为已排好序和未排好序两部分。
每次将未排好序的第一个元素插入到已排好序部分的相应位置,直至全部元素有序。
二、具体实现1. 直接插入排序直接插入排序是最基本的插入排序算法。
它从第二个元素开始遍历待排数组,将当前元素与前面已经排好序的元素依次比较,找到合适位置并插入。
2. 希尔排序希尔排序是直接插入排序的改进版。
它通过设置增量gap来分组进行直接插入排序,每轮对每个组进行一次直接插入排序。
随着增量gap逐渐减小,组数也逐渐减少,当gap=1时即为最后一轮直接插入排序。
三、优化方案1. 二分查找优化在寻找待插入位置时使用二分查找可以提高效率。
二分查找的时间复杂度为O(logn),相比于直接比较可以减少一部分比较次数。
2. 跳跃式插入跳跃式插入是对直接插入排序的优化,它将待插入元素与一定间隔的元素进行比较,从而减少了比较次数。
四、应用场景由于插入排序在小规模数据时表现优异,因此常被用于对小规模数据进行排序。
同时,由于其稳定性较好,也常被用于稳定性要求较高的场景。
五、总结插入排序是一种简单直观的排序算法,通过构建有序序列实现对待排数组的排序。
虽然时间复杂度为O(n^2),但在小规模数据时表现优异,并且稳定性良好。
同时,通过二分查找和跳跃式插入等优化方案可以进一步提高效率。
⽤Java实现常见的8种内部排序算法⼀、插⼊类排序插⼊类排序就是在⼀个有序的序列中,插⼊⼀个新的关键字。
从⽽达到新的有序序列。
插⼊排序⼀般有直接插⼊排序、折半插⼊排序和希尔排序。
1. 插⼊排序1.1 直接插⼊排序/*** 直接⽐较,将⼤元素向后移来移动数组*/public static void InsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i]; //temp ⽤于存储元素,防⽌后⾯移动数组被前⼀个元素覆盖int j;for(j = i; j > 0 && temp < A[j-1]; j--) { //如果 temp ⽐前⼀个元素⼩,则移动数组A[j] = A[j-1];}A[j] = temp; //如果 temp ⽐前⼀个元素⼤,遍历下⼀个元素}}/*** 这⾥是通过类似于冒泡交换的⽅式来找到插⼊元素的最佳位置。
⽽传统的是直接⽐较,移动数组元素并最后找到合适的位置*/public static void InsertSort2(int[] A) { //A[] 是给定的待排数组for(int i = 0; i < A.length - 1; i++) { //遍历数组for(int j = i + 1; j > 0; j--) { //在有序的序列中插⼊新的关键字if(A[j] < A[j-1]) { //这⾥直接使⽤交换来移动元素int temp = A[j];A[j] = A[j-1];A[j-1] = temp;}}}}/*** 时间复杂度:两个 for 循环 O(n^2)* 空间复杂度:占⽤⼀个数组⼤⼩,属于常量,所以是 O(1)*/1.2 折半插⼊排序/** 从直接插⼊排序的主要流程是:1.遍历数组确定新关键字 2.在有序序列中寻找插⼊关键字的位置* 考虑到数组线性表的特性,采⽤⼆分法可以快速寻找到插⼊关键字的位置,提⾼整体排序时间*/public static void BInsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i];//⼆分法查找int low = 0;int high = i - 1;int mid;while(low <= high) {mid = (high + low)/2;if (A[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}//向后移动插⼊关键字位置后的元素for(int j = i - 1; j >= high + 1; j--) {A[j + 1] = A[j];}//将元素插⼊到寻找到的位置A[high + 1] = temp;}}2. 希尔排序希尔排序⼜称缩⼩增量排序,其本质还是插⼊排序,只不过是将待排序列按某种规则分成⼏个⼦序列,然后如同前⾯的插⼊排序⼀般对这些⼦序列进⾏排序。
24种插入法24种插入法是一种优化排序算法,它的基本思想是将一个列表分为已排序区间和未排序区间,每次从未排序区间取出一个元素,插入到已排序区间的正确位置,使已排序区间保持有序。
在这个过程中,相邻元素的比较和交换次数都很少,所以可以提高排序的效率。
此外,24种插入法还有一些变体,可以根据不同情况选用相应的插入法,达到更好的排序效果。
以下是24种插入法的详细介绍:1. 直接插入排序直接插入排序是最简单的插入法,它将未排序元素插入到已排序区间合适的位置。
时间复杂度为O(n²),空间复杂度为O(1)。
2. 折半插入排序折半插入排序是对直接插入排序的优化,它采用二分查找的方式找到插入位置。
时间复杂度为O(n²),空间复杂度为O(1)。
3. 希尔排序希尔排序是一种针对直接插入排序的改进,它将列表按照一定步长分组,每个子列表采用直接插入排序,随着步长逐渐缩小,最终变为一组,完成排序。
时间复杂度为O(nlogn),空间复杂度为O(1)。
4. 二路插入排序二路插入排序是对直接插入排序的改进,它采用两个指针,在有序区间之前和之后分别插入未排序元素。
时间复杂度为O(n²),空间复杂度为O(1)。
5. 多关键词插入排序多关键词插入排序是针对多关键词排序的优化,它将排序条件拆分为多个关键词,分别进行插入排序。
时间复杂度为O(nlogn),空间复杂度为O(1)。
6. 基数插入排序基数插入排序是对基数排序的优化,它使用插入法对每个桶内的元素进行排序,并合并桶内已排序的元素。
时间复杂度为O(dn),空间复杂度为O(max)。
7. 大小插入排序大小插入排序是对多关键词排序的优化,它根据元素的大小关系建立排序树,对树进行遍历并插入已排序区间。
时间复杂度为O(nlogn),空间复杂度为O(nlogn)。
8. 块插入排序块插入排序是对桶排序的优化,它将待排序元素分为若干块,分别进行插入排序,再将已排序块合并。
直接插入排序的主要代码直接插入排序是一种简单但有效的排序算法。
它的基本思想是将待排序的元素插入到已经排好序的序列中,从而得到一个新的有序序列。
下面将详细介绍直接插入排序的主要代码。
一、算法流程直接插入排序的算法流程如下:1. 将待排序的元素分为已排序区间和未排序区间,初始时已排序区间只包含一个元素,即第一个元素。
2. 从未排序区间取出第一个元素,依次与已排序区间中的元素进行比较,找到合适的位置插入该元素,并将已排序区间相应地调整。
3. 重复步骤2,直到未排序区间中所有元素都被插入到已排序区间中。
二、主要代码下面是直接插入排序的主要代码:```pythondef insertion_sort(arr):n = len(arr)for i in range(1, n):# 将arr[i]插入到已排好序的子数组中temp = arr[i]j = i - 1while j >= 0 and arr[j] > temp:arr[j + 1] = arr[j]j -= 1arr[j + 1] = tempreturn arr```三、代码解析该代码使用Python编写。
其中,insertion_sort函数接受一个列表作为参数,返回一个排好序的列表。
在函数内部,首先获取列表的长度,并使用for循环遍历未排序区间中的元素。
循环变量i表示当前需要插入的元素在未排序区间中的位置。
接着,将arr[i]保存到temp变量中。
j变量表示已排序区间中待插入位置的索引,初始值为i-1。
然后,使用while循环将arr[i]插入到已排好序的子数组中。
如果arr[j]大于temp,则将arr[j]向右移动一位,并将j减1。
循环结束后,将temp插入到arr[j+1]中。
最后,返回排好序的列表。
四、时间复杂度和空间复杂度直接插入排序算法的时间复杂度为O(n^2),空间复杂度为O(1)。
其中,n为待排序元素个数。
五、优化直接插入排序算法可以进行一些优化,例如使用二分查找来寻找待插入元素在已排好序子数组中的位置,可以减少比较次数。
直接插入排序法的算法1.引言1.1 概述直接插入排序法是一种简单而常见的排序算法,它的基本思想是将未排序的元素逐个插入到已排序的序列中,直至整个序列有序。
该算法的时间复杂度为O(n^2),适用于数据规模较小的情况。
在直接插入排序法中,我们从第二个元素开始,将它与已排序序列中的元素进行比较,将其插入到合适的位置。
具体来说,我们将第二个元素与第一个元素进行比较,如果第二个元素小于第一个元素,则交换它们的位置;然后再将第三个元素与前两个元素进行比较并交换位置,以此类推,直到将全部元素都插入到合适的位置为止。
这种排序方法相对于其他排序算法的优点在于,它的实现较为简单,算法的代码逻辑易于理解。
此外,直接插入排序法是一种稳定的排序算法,即相等元素在排序后的位置不会发生变化。
这个特点对于某些特定场景非常重要。
直接插入排序法在实际应用中也有一定的局限性。
由于其时间复杂度较高,当数据规模较大时,其性能明显不如其他高效的排序算法。
因此,在实际应用中,我们需要根据具体情况选择合适的排序算法。
通过本文,我们将详细介绍直接插入排序法的原理和步骤,并探讨其优点和应用。
通过学习直接插入排序法,读者将能够更好地理解排序算法的工作原理,并能够灵活运用它们解决实际问题。
1.2 文章结构本文主要介绍了直接插入排序法的算法。
文章分为引言、正文和结论三个部分。
引言部分首先概述了直接插入排序法的基本概念和原理。
随后介绍了文章的结构和目的,即对直接插入排序法进行详细的解析和讨论。
正文部分主要包括两个小节,分别是直接插入排序法的原理和步骤。
在原理部分,将详细解释直接插入排序法的工作原理和算法思想,包括如何将无序的序列按照升序排列。
在步骤部分,将逐步介绍直接插入排序法的具体步骤和实现过程,包括比较和交换元素的操作。
结论部分总结了直接插入排序法的优点和应用场景。
在优点部分,将强调直接插入排序法的稳定性、简单性和适用性。
在应用部分,将介绍直接插入排序法在实际问题中的应用场景,例如对小规模或基本有序的序列进行排序等。
一插入排序1.1 直接插入排序基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。
图解:代码实现:[cpp]view plaincopy1.//直接顺序排序2.void InsertSort(int r[],int n)3.{4.for(int i=2;i<n;i++)5.{6.r[0]=r[i];//设置哨兵7.for(int j=i-1;r[0]<r[j];j--)//寻找插入位置8.r[j+1]=r[j];//记录后移9.r[j+1]=r[0];10.}11.for(int k=1;k<n;k++)12.cout<<r[k]<<"";13.cout<<"\n";14.}1.2 希尔排序基本思想是:先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。
图解:代码实现:[cpp]view plaincopy1.<spanstyle="font-size:14px;">//希尔排序2.void ShellSort(int r[],int n)3.{4.int i;5.int d;6.int j;7.for(d=n/2;d>=1;d=d/2)//以增量为d进行直接插入排序8.{9.for(i=d+1;i<n;i++)10.{11.r[0]=r[i];//暂存被插入记录12.for(j=i-d;j>0&&r[0]<r[j];j=j-d)13.r[j+d]=r[j];//记录后移d个位置14.r[j+d]=r[0];15.}16.}17.for(i=1;i<n;i++)18.cout<<r[i]<<"";19.cout<<"\n";20.}</span>二交换排序2.1 起泡排序起泡排序是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。
详解排序算法(⼀)之3种插⼊排序(直接插⼊、折半插⼊、希尔)直接插⼊排序打过牌的⼈都知道,当我们拿到⼀张新牌时,因为之前的牌已经经过排序,因此,我们只需将当前这张牌插⼊到合适的位置即可。
⽽直接插⼊排序,正是秉承这⼀思想,将待插⼊元素与之前元素⼀⼀⽐较,从⽽找到合适的插⼊位置。
那么使⽤直接插⼊排序,具体是怎样操作的呢?我们取 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 来进⾏⽰范。
(1)第1轮排序,3之前⽆可⽐较值,因此我们从44开始操作,取44和3⽐较,⼤于3,顺序保持不变。
得数据3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48(2)第2轮排序,取38和44⽐较,38 < 44,再将38与3⽐较,38 > 3,故将38放于第2位,得数据3, 38, 44, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48(3)第3轮排序,取5与44⽐较,5 < 44,再将5与38⽐较,5 < 38,再将5与3⽐较,5 > 3, 置于第2位,得数据3, 5, 38, 44, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48(4)如此经过14轮排序后,得到最终结果2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50动态图javascript实现function directInsertSort (arr) {let compare, // 对⽐元素下标current // 待插⼊元素值for (let i = 1; i < arr.length; i++) {current = arr[i]compare = i - 1while (current < arr[compare] && compare >= 0) {arr[compare + 1] = arr[compare]compare--}arr[compare + 1] = current}return arr}折半插⼊排序细⼼的同学可能已经注意到,当我们要将⼀个元素插⼊合适的位置时,其之前的元素是有序的,因此,我们可以⽤折半查找的⽅式来⽐对并插⼊元素,也就是所谓的折半插⼊排序。
#include <iostream>
using namespace std;
void insert_sort(int a[],int length)
{
int t;
for(int i=0;i<length;i++)
{
t=a[i]; //将待排序的元素a[i]赋给t
for(int j=i-1;j>=0&&a[j]>t;j--)
{
a[j+1]=a[j]; //把比t大(a[j]>t)的元素,全部后移一个位置 }
a[j+1]=t; //把待排序的t插入到a[j+1].完成插入排序过程。
}
}
int main()
{
int a[5]={12,5,41,36,89};
insert_sort(a,5);
for(int i=0;i<5;i++)
cout<<a[i]<<" ";
return 0;
}
//直接插入排序算法
#include <iostream>
using namespace std;
#define MAXSIZE 20 //定义顺序表的最大长度
//定义顺序表的存储结构
typedef int KeyType; //定义关键字为整数类型typedef struct
{
KeyType key; //关键字项
} RedType; //记录类型
typedef struct
{
RedType r[MAXSIZE+1]; //r[0]用作哨兵单元
int length; //顺序表长度
} SqList; //顺序表类型
//函数原型声明
void InitiSeqList(SqList &L, int n); //初始化顺序表函数
void DisplayNoSort(SqList &L); //输出排序前的顺序表
bool LT(int a, int b); //关键字比较函数
void InsertSort(SqList &L); //插入排序函数
void DisplayInsertSort(SqList &L); //输出排序后的顺序表
//main函数
int main()
{
SqList seqlist;
InitiSeqList(seqlist,MAXSIZE);
DisplayNoSort(seqlist);
InsertSort(seqlist);
DisplayInsertSort(seqlist);
return 0;
}
//初始化顺序表函数,初始化为含n个元素的顺序表
void InitiSeqList(SqList &L, int n)
{
L.length=n; //顺序表长度
for(int i=1; i<=L.length; ++i)
{
L.r[i].key=rand()%90+10; //产生10到100之间的随机数}
}
//输出排序前的顺序表
void DisplayNoSort(SqList &L)
{
cout<<"插入排序前的顺序表:"<<endl;
for(int i=1; i<=L.length; ++i)
{
cout<<L.r[i].key<<" ";
if(i%10==0)
cout<<endl;
}
}
//关键字比较函数
bool LT(int a, int b)
{
return a<b ? true : false;
}
//插入排序函数
void InsertSort(SqList &L)
{
// 对顺序表L作直接插入排序
int i,j;
for (i=2; i<=L.length; ++i)
if (LT(L.r[i].key, L.r[i-1].key)) // "<"时,需将L.r[i]插入有序子表{
L.r[0] = L.r[i]; // 复制为哨兵
for (j=i-1; LT(L.r[0].key, L.r[j].key); --j)
L.r[j+1] = L.r[j]; // 记录后移
L.r[j+1] = L.r[0]; // 插入到正确位置
}
} // InsertSort
//输出经直接插入排序后的顺序表
void DisplayInsertSort(SqList &L)
{
cout<<"插入排序后的顺序表:"<<endl;
for(int i=1; i<=L.length; ++i)
{
cout<<L.r[i].key<<" ";
if(i%10==0)
cout<<endl;
}
}。