数据结构(C语言)排序--插入排序--插入折半排序--希尔排序--快速排序

本文介绍了C语言中两种常见的排序算法:插入排序和快速排序。插入排序的时间复杂度为O(n^2),通过将未排序元素插入到已排序部分来实现。快速排序是一种效率较高的排序方法,其平均时间复杂度为O(n log n)。文章详细讲解了这两种排序方法的实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序

在C语言初级学习中 众所周知了冒泡排序法,选择排序法(擂台排序),介绍一下C中其他的排序方式

插入排序

插入思维简单S(n)=O(n) T(n)=o(n平方)
就是将排序的中小的数拿出,排序到它应该在的位置
因为我们拿出数插入,所以可以将首位单个元素看作一个已经排好序的数组。同时依次插入,依次为排行序的数组(例如第二位进入一次for循环,插入到第一位,此时,前两位就为一个有序表。

void InsertSort(sqList &L){
     //插入排序 
   int  i,j;
 for(i=2;i<=L.length;++i)   //从第二位开始,往后 
    if(L.r[i]<L.r[i-1]){
         //然后后 小于前一位 
    	L.r[0]=L.r[i];     // 后(该数)赋值给哨兵 
    	L.r[i]=L.r[i-1];   //然后前一位大的数 后移 
    for(j=i-2; L.r[0]<L.r[j];--j)   //前i-2位,大于该数 都后移 
     L.r[j+1]=L.r[j];    //后移 
     L.r[j+1]=L.r[0];    //插人到小于该数的数 后面 
	}
} 

快速排序

 //一趟快速排序 
int Partition(sqList &L,int low,int high){
     //LOW为首位1,high为最后一位=length
	L.r[0]=L.r[low];  //low为枢纽, 暂存在0位 
	int pivotkey=L.r[low];  //枢纽记录值 
	 while(low<high){
        //从变的两端交替查找,LOW和high相等就停止 
	 while(low<high&&L.r[high]>=pivotkey) --high;
	 L.r[low]=L.r[high];           //将小于枢纽的数移动到低端 
	 while(low<high&&L.r[low]<=pivotkey) ++low;
	 L.r[high]=L.r[low];          //将大于枢纽的数移动到高端 
	 }
	 L.r[low]=L.r[0];     //枢纽记录的数回到空位 
	 return low;          //返回枢纽值 
} 
void QSort(sqList &L,int low ,int high){
   
	if(low<high){
   
		int pivotloc=Partition(L,low,high);  //返回为枢纽值 ,枢纽一直使用
		QSort(L,low,pivotloc-1); //对于前面小的表来说, pivotloc是高位(pivotloc不参与再排序) 
		QSort(L,pivotloc+1,high); //对于后面大的表来说, pivotloc是低位 
	}
} 
void QuckSort(sqList &L){
     //让函数简洁,对表操作 
	QSort(L,1,L.length);
} 

总实现

#include <stdio.h>
#include <stdlib.h>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值