交换排序的概念和C语言实现和计数排序的C语言实现

目录

交换排序

1.基本思想

2.冒泡排序

2.1.特性总结

2.2.代码实现

3.快速排序

3.1.特性总结

3.2.代码实现

计数排序

2.1代码实现

交换排序

1.基本思想

交换便是比对序列中两个数据的大小,根据两者的大小关系交换二者在序列中的位置。

其中是将数据较大的值向序列的尾部移动,数据较小的值向序列的首部移动。

2.冒泡排序

便是不断的较大数据后移,较小元素前移。

2.1.特性总结

  • 时间复杂度:O(N^2);
  • 空间复杂度:O(1);
  • 稳定性:稳定

2.2.代码实现

#include<stdio.h>
#include<string.h>

void Swap(int *a, int *b){
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
}

void BubbleSort(int arr[], int size){
	for (int i = 0; i < size - 1; i++){
		for (int j = 0; j < size - 1 - i; j++){
			if (arr[j] > arr[j + 1]){
				Swap(&arr[j], &arr[j + 1]);
			}
		}
	}
}

void PrintSort(int arr[], int size){
	for (int i = 0; i < size; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[9] = { 9, 5, 6, 8, 3, 7, 4, 2, 1 };
	int size = sizeof(arr) / sizeof(arr[0]);

	BubbleSort(arr, size);
	PrintSort(arr, size);

	return 0;
}

3.快速排序

任取待排序序列中的某个元素作为基准值,按照该数据将序列分割成为两个子列,左子列中数据均小于基准值,右子列中数据均大于基准值。

然后左右子列均重复上述过程,直到所有的元素均排列在合适位置上。

3.1.特性总结

  • 快速排序整体性能和效率良好,所以适用范围较广
  • 时间复杂度:O(N*logN);
  • 空间复杂度:O(logN);
  • 稳定性:不稳定。

3.2.代码实现

#include<stdio.h>
#include<string.h>

void Swap(int *a, int *b){
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
}

//取最左侧数据为key
int Partion(int arr[], int left, int right){
	int begin = left;
	int end = right - 1;

	int key = arr[end];

	while (begin < end){ 
		while (begin < end && arr[begin] <= key)
			begin++;

		while (begin < end && arr[end] >= key)
			end--;

		if (begin < end){
			Swap(&arr[begin], &arr[end]);
		}
	}

	if (begin != right - 1)
		Swap(&arr[begin], &arr[right - 1]);

	return begin;
}

void QuickSort(int arr[], int left, int right){
	if (right - left < 1)
		return;

	int dev = Partion(arr, left, right);

	QuickSort(arr, left, dev);

	QuickSort(arr, dev + 1, right);

}

void PrintSort(int arr[], int size){

	for (int i = 0; i < size; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[9] = { 9, 5, 6, 8, 3, 7, 4, 2, 1 };
	int size = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = size;

	QuickSort(arr, left, right);
	PrintSort(arr, size);

	return 0;
}

计数排序

2.1代码实现

#include<stdio.h>
#include<stdlib.h>

void CountSort(int arr[], int size){

	int minVal = arr[0];
	int maxVal = arr[0];
	for (int i = 11; i < size; i++){
		if (arr[i] < minVal)
			minVal = arr[i];

		if (arr[i] > maxVal)
			maxVal = arr[i];
	}

	int range = maxVal - minVal + 1;
	int *countArr = (int*)calloc(range, sizeof(int));

	for (int i = 0; i < size; i++){
		countArr[arr[i] - minVal]++;
	}

	int index = 0;
	for (int i = 0; i < range; i++){
		while (countArr[i] > 0){
			arr[index] = i + minVal;
			countArr[i]--;
			index++;
		}
	}

	free(countArr);
}

void PrintSort(int arr[], int size){

	for (int i = 0; i < size; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 1, 3, 5, 7, 8, 9, 6, 4, 2, 3, 5, 6, 7, 1, 5, 9, 4, 6, 3, };
	int size = sizeof(arr) / sizeof(arr[0]);

	CountSort(arr, size);
	PrintSort(arr, size);

	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值