数据结构c语言版八大算法(上)图文详解带你快速掌握——希尔排序,堆排序,插入排序,选择排序,冒泡排序!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构c语言版八大算法(上)图文详解带你快速掌握——希尔排序,堆排序,插入排序,选择排序,冒泡排序!相关的知识,希望对你有一定的参考价值。

数据结构之八大算法详解(1)——希尔排序,堆排序,插入排序,选择排序,冒泡排序!

插入排序

基本思想

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高

  2. 时间复杂度:O(N^2^)

  3. 空间复杂度:O(1),它是一种稳定的排序算法

  4. 稳定性:稳定

希尔排序( 缩小增量排序 )

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个 组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。当到达=1时,所有记录在统一组内排好序。

希尔排序的特点

  1. 希尔排序是对直接插入排序的优化。

  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。

  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的 希尔排序的时间复杂度都不固定:

我们的gap取值是用kunyh提出来的方法进行取值的,而且kunth,而且Knuth进行了大量的试验统计,我们就按O(n^1.25^)到O(1.6n^1.25^)来算!

  1. 稳定性:不稳定

堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是 通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)(每一次调整堆的时间复杂度为logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

分为两步

//代码演示
typedef int HPdataType;
void AdjustDown(HPdataType* a,int parent,int size)

    int child = parent*2+1;
    
    while(child < size)
    
        if(child +1 < size && a[child] < a[child+1])
        
            child++;
        
        if(a[parent] < a[child])
        
            swap(&a[parent],&a[child]);
            parent = child;
            child = parent*2+1;
        
        else
        
            break;
        
    

void swap(HPdataType* x,HPdataType* y)

    HPdataType temp = *x;
    *x = *y;
    *y = temp;

int main()

    HPdataType a[] = 1,4,19,15,7,34,65,25,27,8;
    
    int size = sizeof(a)/sizeof(a[0]);
    for(int i = (size-2)/2;i>=0;i--)//i>0的话无法调整到顶部!
    
        AdjustDown(a,i,size);
    //完成建堆
    for(int i = 1;i<size;i++)
    
        swap(&a[0],&a[size-1-i]);//为什么要-i呢,因为把该堆最大(小)的放在最后面,然后就不要动他,开始放次大(小)
        AdjustDown(a,0,size-i);//然后开始进行调整!
        
    return 0;

直接选择排序

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完 。

void SlectSort(int* a, int size)//升序

	int begin = 0; int end = size - 1;
	while (begin < end)
	
		int mini = begin;
		int maxi = begin;
		for (int i = begin+1; i <= end; i++)
		
			if (a[mini] > a[i])
			
				mini = i;
			
			if (a[maxi] < a[i])
			
				maxi = i;
			
		
		swap(&a[mini], &a[begin]);//因为begin == maxi 所以这样写的话,先是最大和最小互换,然后是最小的最大互换又换回来了!
		swap(&a[maxi], &a[end]);
		begin++;
		end--;
	


void SlectSort(int* a, int size)//升序

	int begin = 0; int end = size - 1;
	while (begin < end)
	
		int mini = begin;
		int maxi = begin;
		for (int i = begin+1; i <= end; i++)
		
			if (a[mini] > a[i])
			
				mini = i;
			
			if (a[maxi] < a[i])
			
				maxi = i;
			
		
		swap(&a[mini], &a[begin]);
		if (maxi == begin)
		
			maxi = mini;//修正一下,bigini的位置被换到mini的位置那边去了!
		
		swap(&a[maxi], &a[end]);
		begin++;
		end--;
	

直接选择排序的特点

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

  2. 时间复杂度为O(^2^)

  3. 空间复杂度为O(1)

  4. 稳定性 :不稳定!

冒泡排序

  • 空间复杂度:O(1)

  • 稳定性:稳定

  • 以上是关于数据结构c语言版八大算法(上)图文详解带你快速掌握——希尔排序,堆排序,插入排序,选择排序,冒泡排序!的主要内容,如果未能解决你的问题,请参考以下文章

    图文 | 详解八大算法思想

    数据结构之八大排序算法(C语言实现)

    视频+图文带你快速掌握Java中含continue语句的双重for循环

    Carson带你学数据结构:图文详解冒泡排序 & 优化

    算法图解八大排序

    程序员必备 | 图文讲解八大排序算法