上一节我为大家介绍了几种相对简单的排序算法,如冒泡、插入、选择等排序,这几种排序算法的时间复杂度是o(N^2),这些排序算法在数据量比较少时,其计算的时间也不会显得很大,但数据量比较大,比如100万、1000万时,我们就要使用时间复杂度更优的算法,比如快排和归并排序,下面我就为大家详细介绍这两种先进的排序算法。
int);voidInsertSort2(int[],int);// 有哨兵的插入排序,数组下标为0处不存储数据元素voidPrintData2(int[],int);intmain(){intA1[]={49,38,65,97,76,13,27,49};InsertSort(A1,8);PrintData(A1,8);printf("\n");intA2[]={0,49,38,65,97,76,13,27,49};InsertSort2(A2,8);PrintData2...
如下: #include"stdio.h"#include"string.h"#include<stdlib.h>#define N5//直接插入排序voidInsertSort(int*a)//升序{int i,j,t;for(i=1;i<N;i++)//从数组第二个元素开始{if(a[i-1]>a[i])//如果这次循环中i-1的数大于a[i]的话,说明前面的元素也可能会有大于a[i]的;如果不大于,则前面...
到这里可以看到数据排序已经完成了。 整体运行流程如下: 下面测试一下最坏情况下的排序情况 可以看到最坏情况下排序的次数并没有增多,反而感觉还减少了。 在看一下最好情况下的排序情况: 最好情况下数据也要进行比较9次。 下来随机生成一个包含10000个数字的数组,测试下执行时间。 可以看到对10000个数字排序需要的...
待排序记录数量很大,以至于内存不能容纳全部数据,在排序的时候需要对外存进行访问的排序过程。 时间复杂度 关键字的比较次数和记录移动次数。 空间复杂度 执行算法所需的附加存储空间。 插入排序 直接插入排序 是一种简单的排序方法,基本操作是将一条记录插入到已排好序的有序列表中,从而得到一个新的、记录数量增一...
下面是一个简单的C语言实现交换排序的例子:void swapSort(int arr[], int len) { int i, j, temp;for (i = 0; i < len - 1; i++) { for (j = i + 1; j < len; j++) { if (arr[i] > arr[j]) { temp = arr[i];arr[i] = arr[j];arr[j] = temp;} } } } 在上面的...
堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算。 C代码实现 代码看起来比较抽象,将代码运行时数据交换的过程打印出来,然后结合二叉树的图形来分析,就会比较好理解了。 代码运行过程中数据交换过程如下: 为了方便观看这里使用二叉树图形生成软件,通过二叉树图形来观察数据交换过程。 二叉树图...
#include<stdio.h>#include<string.h>#include<stdlib.h>int main (){int array[20]={0};int a[13]={1,7,1,8,2,4,3,16,10,11,19,12,0};printf("排序前数组\n");for(int i=0;i<13;i++){ printf("%-5d",a[i]); int c=a[i]; array[c]+=1;}printf("\n");printf...
// 选择排序#include <stdlib.h>#include <stdio.h>// 交换两个变量的值。void swap(int *x,int *y){ int itmp=*x; *x=*y; *y=itmp;}// 采用两层循环实现的方法。// 参数arr是待排序数组的首地址,len是数组元素的个数。void selectsort1(int *arr,unsigned int len){ if (len<2)...