常用排序算法的C语言实现

最近看数据结构,把常用的排序算法用C语言写了一下。

没有按数据结构上的定义SqList结构体,只是用数组的形式实现

有的算法并没有完全按书上给出的算法,但思路一致。

#include<stdio.h>
void InsertSort(int[], int);	//直接插入排序 无哨兵
void BInsertSort(int[], int);	//折半插入排序
void BubbleSort(int[], int);	//起泡排序
void QSort(int[], int, int);	//快速排序
void SelectSort(int[], int);	//简单选择排序

int main(){
	//int num[] = {12,23,21,23,123,21,2,221,12,44};
	int num[] = {4,3,6,7,2,13,21,9,8,34};
	//int num[] = {38,65,97,76,13,27,49};  //快排使用
	int i;
	int len = 10;

	//InsertSort(num, len);
	//BInsertSort(num, len);
	//BubbleSort(num, len);
	//len = 7;
	//QSort(num, 0, len-1);
	//SelectSort(num, len);

	for(i=0; i<len;i++)
	{
		printf("%d ", num[i]);
	}
	printf("\n");
	return 0;
}

//直接插入排序,前i个数保持有序
void InsertSort(int num[], int len)
{	//直接插入排序 无哨兵
	int i,j,temp;
	for(i=1; i<len; i++){
		temp = num[i];
		for(j=i; j>0; j--)
		{
			if(temp < num[j-1]){
				num[j] = num[j-1];
			}else{
				break;
			}
		}
		num[j] = temp;
	}
}

//折半插入排序
void BInsertSort(int num[], int len){
	int i,j,temp,low,high,mid;
	for(i=1; i<len; i++)
	{
		if(num[i] >= num[i-1]) continue;
		temp = num[i];
		low = 0;
		high = i-1;
		mid = (low + high)/2;
		while(low <= high)
		{
			if(num[mid] > temp){
				high = mid - 1;
			}else
			{
				low = mid + 1;
			}
			mid = (low + high)/2;
		}
		//二分查找完成后,low会指向应插入的位置
		for(j=i; j>=low; j--)
		{
			num[j] = num[j-1];
		}
		num[low] = temp;
	}
}

//起泡排序
void BubbleSort(int num[], int len){
	int i, j, temp;
	int change = 1;
	for(i=len; i>0; i--)
	{
		if(change == 0) break;
		change = 0;
		for(j=1; j<i; j++)
		{
			if(num[j-1] > num[j]){
				temp = num[j-1];
				num[j-1] = num[j];
				num[j] = temp;
				change = 1;
			}
		}
	}
}

//快速排序
int Partition(int num[], int low, int high)
{	//一趟快排,返回枢轴位置
	int temp = num[low];
	while(low < high)
	{
		while(low<high && num[high] >= temp) --high;
		num[low] = num[high];
		while(low<high && num[low] <= temp) ++low;
		num[high] = num[low];
	}
	num[low] = temp;
	return low;
}
void QSort(int num[], int low, int high)
{	//递归进行快速排序
	int pivotloc;
	if(low < high){
		pivotloc = Partition(num, low, high);
		QSort(num, low, pivotloc-1);
		QSort(num, pivotloc+1, high);
	}
}

//简单选择排序
//算法描述:i:0→len; get minValueTag from [i] to [len-1]; [i]<>[minValueTag];
void SelectSort(int num[], int len){
	int i, j, minValueTag, temp;
	for(i=0; i<len; i++)
	{
		minValueTag = i;
		for(j=i; j<len; j++)
		{
			if(num[j] < num[minValueTag]){
				minValueTag = j;
			}
		}
		if(minValueTag != i){
			temp = num[i];
			num[i] = num[minValueTag];
			num[minValueTag] = temp;
		}
	}
}

仅供参考,因个人水平及时间有限,文章的错误和不足之处还望指正

参考文献:

《数据结构(C语言版)》  严蔚敏 吴伟民 著  清华大学出版社

时间: 2024-07-30 00:10:28

常用排序算法的C语言实现的相关文章

深入排序算法的多语言实现

深入浅出排序算法的多语言实现 作者:白宁超 2015年10月8日20:08:11 摘要:十一假期于实验室无趣,逐研究起数据结构之排序.起初觉得就那么几种排序,两三天就搞定了,后来随着研究的深入,发觉里面有不少东西.本文介绍常用的排序算法,主要从以下几个方面:算法的介绍.算法思想.算法步骤.算法优缺点.算法实现.运行结果.算法优化等.最后对本文进行总结.本文为作者原创,程序经测试无误.部分资料引用论文和网络材料以及博客,后续参见参考文献.(本文原创,转载注明出处) 1 排序的基本概念 排序: 所谓

常用排序算法小结

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 //the basic bubble sort 6 void maopao1(int *num,int len) 7 { 8 int i,j; 9 int temp; 10 for (i = 0; i < len-1; ++i) 11 { 12 for (j = i+1; j<len; ++j) 13 { 14 if (num[i]>num[j]) 15 { 16 t

【最全】经典排序算法(C语言)

本文章包括所有基本排序算法(和其中一些算法的改进算法): 直接插入排序.希尔排序.直接选择排序.堆排序.冒泡排序.快速排序.归并排序.基数排序. 算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首元素,并把它赋值给temp变量: 从排好的序列中,依次与temp进行比较,如果元素比temp大,则将元素后移(实际上放置temp的元素位置已经空出) 直到

常用排序算法的python实现

排序算是编程最基本的算法问题之一了,熟练掌握排序算法也能加深自己对数据结构的理解,也能提高自己的编程能力,以下为个人参考许多大神博客后对常用排序算法的学习总结. 目录: 概述 冒泡排序 直接插入排序 简单选择排序 希尔排序 堆排序 归并排序 快速排序 算法的比较与测试 参考 1. 概述 所谓排序(sorting)就是整理数据的序列,使其按照特定顺序排列的操作.排序在现实生活中(如整理书籍,表格数据等),在计算领域中(如二分查找,图论的最小生成树的Kruskal算法)均有重要意义,所以一种高效的排

排序算法总结(C语言版)

1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择排序 3.1     直接选择排序 3.2     堆排序 4.    归并排序 4.1     二路归并排序 4.2     自然合并排序 5.    分布排序 5.1     基数排序 1.插入排序 1.1      直接插入排序 将已排好序的部分num[0]~num[i]后的一个元素num[i+1]插入到之前已排好序的

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

常用排序算法之——归并排序

归并排序的原理: 如果数组的元素个数大于1,则: 将数组平均分为两部分: 左边的数组归并排序:递归 右边的数组归并排序:递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果:返回 否则,数组元素个数为1时,已经有序:直接返回. 稳定排序.时间复杂度在最坏.最好.平均情况下都为O(N lgN),空间复杂度为O(N). 代码: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T>