各种经典排序算法的实现C语言版本,可直接使用(加必要的文字说明)

#include<stdio.h>
#define MAXSIZE 100
typedef int dataType;
typedef struct {
	dataType key;
	char name[5];
}Data;

typedef struct {
	Data r[MAXSIZE + 1];
	int length;
}SeqList;

//直接插入排序
int InsertSort(SeqList *L) {
	int i = 2;	//从第二个位置开始排序
	if (L->length == 1)
	{	
		return 1; //一个元素,不用排序
	}
	while (i <= L->length) {
		if (L->r[i].key < L->r[i-1].key)
		{	//如果当前i比它前一个元素小,则没有必要进行排序了
			L->r[0] = L->r[i]; //将元素放入0号位置
			int j = i - 1;
			while (L->r[0].key < L->r[j].key) {
				L->r[j + 1] = L->r[j];	//移动元素
				j--;
			}
			L->r[j + 1] = L->r[0];	//将元素插入
		}	
		i++;
	} 
	return 1;
}
//冒泡排序法
int buble_sort(SeqList *L) {
	int flag = 1;

	for (int i = L->length; i >0 && flag == 1; i--)
	{
		flag = 0; //置标志域,当发生了交换,则设置为1,若一遍排序之后元素没发生交换,则说明元素有序
		for (int j = 1; j < i; j++)
		{	//进行冒泡排序算法
			if (L->r[j].key >L->r[j+1].key)
			{	//交换元素,将值较大的往后移
				L->r[0] = L->r[j];
				L->r[j] = L->r[j + 1];
				L->r[j + 1] = L->r[0];
				flag = 1;
			}
		}
	}
	return 1;
}
//快速排序法  最快的排序算法
int QKpass(SeqList *L,int low,int high) {
	L->r[0] = L->r[low];
	while (low < high) {
		while (low < high&&L->r[high].key >= L->r[0].key) high--;
		L->r[low] = L->r[high];
		while (low < high && L->r[low].key < L->r[0].key) low++;
		L->r[high] = L->r[low];
	}
	L->r[low] = L->r[0];
	return low;
}
//快速排序,调用上面的处理过程
void QKSort(SeqList *L, int low, int high) {
	int pos;
	if (low < high)
	{
		pos = QKpass(L, low, high);
		QKSort(L, 1, pos);
		QKSort(L, pos+1, high);
	}
}
//选择排序法
int selectSort(SeqList *L) {
	Data temp;
	for (int i = 1; i < L->length; i++)
	{	
		int j = i;
		for (int k = i+1; k  <= L->length; k ++)
		{	//内循环一个记录剩下元素最小值的下标
			if (L->r[j].key > L->r[k].key)
			{
				j = k;
			}
		}
		if (j != i)
		{	//交换元素
			temp = L->r[j];
			L->r[j] = L->r[i];
			L->r[i] = temp;
		}
	}

}
/***************************堆排序算法**********************************/
//调整顶堆
void HeapAdjust(SeqList *L, int s, int m) {
	//已知L->r[s..m]中记录关键字除L->r[s].key之外均满足堆的定义
	//调整L->r[s]使之成为一个小顶堆
	Data t = L->r[s];
	for (int i = s*2; i <= m; i*=2)
	{
		if (i<m && (L->r[i].key > L->r[i+1].key))
		{	//找出左右子树当中最小的key的下标值
			i++;
		}
		if (t.key <= L->r[i].key)
		{	//当前堆顶元素比左右子树的key都小,则不用做调整
			break;
		}
		//对元素位置进行调整,使之成为一个堆
		L->r[s] = L->r[i];
		s = i; //进入下一层子树
	}
	//在循环内部对s做了修改,s指向的是当前堆顶的最后一个叶子结点
	L->r[s] = t;
}
//创建顶堆
void CreateHeap(SeqList *L) {
	for (int i = L->length/2; i > 0; i--)
	{
		HeapAdjust(L, i, L->length);
	}
}
//准备工作完成,开始进行堆排序
void HeapSort(SeqList *L) {
	CreateHeap(L); //创建顶堆
	for (int i = L->length; i>1; i--)
	{	//破坏堆顶结构,使之重新调整,然后每次循环将最后一位剪枝
		L->r[0] = L->r[1];
		L->r[1] = L->r[i];
		L->r[i] = L->r[0];
		HeapAdjust(L, 1, i-1);
	}
}


//显示元素值
void displaySeqList(SeqList L) {
	printf("元素的值如下:\n");
	for (int i = 1; i <= L.length; i++)
	{
		printf("%d\t", L.r[i].key);
	}
}
//初始化
int initSeqList(SeqList *L) {
	L->length = 0;
	return 1;
}
//创建序列
void create_SeqList(SeqList *L) {
	printf("请输入元素个数:\n");
	scanf("%d", &(L->length));
	for (int i = 1; i <= L->length; i++)
	{
		printf("请输入第%d个元素:\n",i);
		scanf("%d", &(L->r[i].key));
	}
}

main() {
	SeqList L;
	initSeqList(&L);
	create_SeqList(&L);
	HeapSort(&L);	//自己更换排序的函数调用,这里使用的是堆排序,其它排序函数已经写好
	displaySeqList(L);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,让我来解答这个问题。首先我需要先确认你的问题,你是让我用C语言实现选择排序和冒泡排序,对一个输入的序列进行排序,然后输出排序后的序列和说明算法复杂度,是吗? 如果是的话,那么让我们来看一下如何实现这个功能。选择排序和冒泡排序都是基本的排序算法,它们的核心思想都是比较和交换。接下来我将分别介绍这两种算法实现方法。 选择排序的实现方法如下: ``` #include <stdio.h> void selectionSort(int arr[], int n) { int i, j, min_idx; for (i = 0; i < n-1; i++) { min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; int temp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = temp; } } void printArray(int arr[], int n) { int i; for (i=0; i < n; i++) printf("%d ", arr[i]); printf("\n"); } int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr)/sizeof(arr[0]); selectionSort(arr, n); printf("Sorted array: \n"); printArray(arr, n); return 0; } ``` 接下来是冒泡排序的实现方法: ``` #include <stdio.h> void bubbleSort(int arr[], int n) { int i, j; for (i = 0; i < n-1; i++) for (j = 0; j < n-i-1; j++) if (arr[j] > arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } void printArray(int arr[], int n) { int i; for (i=0; i < n; i++) printf("%d ", arr[i]); printf("\n"); } int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr)/sizeof(arr[0]); bubbleSort(arr, n); printf("Sorted array: \n"); printArray(arr, n); return 0; } ``` 这里我们使用的都是普通的C语言代码实现,你可以将这些代码拷贝到你的编辑器中进行测试。 下面是对这两个算法的时间复杂度分析: - 选择排序的时间复杂度:O(n^2) - 冒泡排序的时间复杂度:O(n^2) 因为这两种算法都需要比较和交换数组中的元素,所以它们的时间复杂度都是平方级别的。当排序序列较小时,这两种算法还是比较有效的。但当排序序列很大时,这两种算法会变得很慢,效率很低。 希望我的回答能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值