数据结构--所有排序算法实现

头文件Function.h

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<assert.h>
void bubblesort(int *a, int n);
void selectsort(int *a, int n);
void insertsort(int *a, int n);
void quicksort(int *a, int left,int right);
int Partition(int *a, int left, int right);
void mergesort(int *a, int low, int high);
void merge(int *a, int low, int mid, int high);
void heapsort(int *a, int n);
void sift(int *a, int low, int high);
void Swap(int *a, int *b);
void Shellsort(int *a, int n);
void doublebubble(int *a, int n);
void oddfront(int *a, int n);
void countsort(int *a, int len);

函数实现Achieve.c

#include"Function.h"

//交换函数
void Swap(int *a, int *b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//冒泡排序

void bubblesort(int *a, int n) {
	int i, j;//排序需要进行的趟数为i,
	int flag = 0;//标志位,如果该趟没有进行交换,则说明序列已经有序
	for (i = 0; i < n-1;i++) {//总共需要进行n-1趟排序可以得到最终结果
		for(j=0;j<n-1-i;j++){
			if (a[j] > a[j + 1])
				Swap(&a[j], &a[j + 1]);
				
		}
		flag = 1;
	}
	if (flag == 0)
		return;
}



//选择排序

void selectsort(int *a, int n) {
	
	int i, j, min, temp;
	for (int i = 0; i < n - 1; i++) {
		min = i;
		for (j = i + 1; j < n; j++)
		{
			if (a[min] > a[j])
				min = j;
		}
		if (i != min)
			Swap(&a[i], &a[min]);
	}
}


//插入排序

void insertsort(int *a, int n) {
	int i, j, temp;
	for (i = 1; i < n; i++) {
		{
			temp = a[i];
			j = i - 1;
		}
		while (j >= 0 && temp < a[j])
		{
			a[j + 1] = a[j];
			--j;
		}
		a[j + 1] = temp;
	}
}
	

	//快速排序
	void quicksort(int *a, int left, int right) {
		int pivot = 0;
		if (left < right) {
			pivot = Partition(a, left, right);
			quicksort(a, left, pivot - 1);
			quicksort(a, pivot + 1, right);
		}
	}

	int Partition(int *a, int left, int right) {
		int pivot = a[left];
		while (left < right) {
			while (right > left&&a[right] > pivot)
				right--;
			a[left] = a[right];
			while (right > left&&a[left] < pivot)
				left++;
			a[right] = a[left];
		}
		a[left] = pivot;
		return left;
	}



///归并排序
	void mergesort(int *a, int low, int high) {
		if (low < high) {
			int mid = (low + high) / 2;
			mergesort(a, low, mid);//分治思想1.分开2.合并
			mergesort(a, mid + 1, high);
			merge(a, low, mid, high);
		}
	}

	
	void merge(int *a, int low, int mid, int high) {
		int i, j, k;
		int n1 = mid - low + 1;
		int n2 = high - mid;
		int L[8], R[7];
		for (i = 0; i < n1; i++)
			L[i] = a[low + i];//注意!!!
		for (j = 0; j < n2; j++)
			R[j] = a[mid + 1 + j];
		i=0, j = 0; k = low;
		while (i < n1&&j < n2) {//注意!!!
			if (L[i] <= R[j])
				a[k++] = L[i++];
			else
				a[k++] = R[j++];
		}

		while (i < n1)
			a[k++] = L[i++];
		while (j < n2)
			a[k++] = R[j++];

	}




	//----------------------堆排序步骤总结--------------------------------
	//1.变成大根堆(从n/2-1开始,下标0结束)
	//2.一次大根堆形成后,先进行一次交换,再继续形成大根堆


	void heapsort(int *a, int n) {
		int i;
		for (i = n / 2 - 1; i >= 0; --i)
			sift(a, i, n - 1);

		for (i = n - 1; i > 0; i++)
		{
			Swap(&a[0], &a[i]);
			sift(a, 0, i - 1);
		}
	}

	//--------------------调整为大根堆的步骤总结---------------------------
		//1.要处理的元素保留下来
		//2.找左右孩子中的较大者并与temp进行比较,会有两种情况,对其进行各自操作。
		//3.把temp放入a[i]即可


	void sift(int *a, int low, int high) {
		int i, j, temp;
		i = low, j = 2 * i + 1;
		temp = a[i];
		while (j <= high) {
			if (j < high&&a[j] < a[j++])
				j++;
			if (temp < a[j])
			{
				a[i] = a[j];
				i = j;
				j = 2 * i + 1;
			}
			else
				break;
		}
		a[i] = temp;

	}




	//希尔排序
	void Shellsort(int *a, int n) {
		int temp;
		for (int gap = n / 2; gap > 0; gap /= 2)//gap为增量
		{
			for (int i = gap; i < n; ++i) {
				temp = a[i];//保存该值
				int j;
				//j从i的位置开始,对前面的增量处的元素进行比较
				for (j = i; j >= gap && a[j - gap] > temp; j -= gap)
					a[j] = a[j - gap];
				    a[j] = temp;

			}
		}
	}

	//双向冒泡排序
	void doublebubble(int *a, int n) {
		int low = 0, high = n - 1;
		bool flag = true;//标志位,进行一次交换操作则赋值为true
		int i;
		while (low < high && flag) {
			flag = false;
			for (i = low; i < high; i++)
				if (a[i] > a[i + 1])
				{
					Swap(&a[i], &a[i + 1]);
					flag = true;
				}
		}
		high--;
		for (i = high; i < low; i--)
			if (a[i] > a[i - 1]) {
				Swap(&a[i], &a[i - 1]);
				flag = true;
			}
	}
	
	
	//把所有奇数移到偶数之前排序
	void oddfront(int *a, int n) {
		int i = 0, j = n - 1;
		while (i < j) {
			while (i < j&&a[i] % 2 != 0)
				i++;
			while (i < j&&a[j] % 2 != 1)
				j--;
			if (i < j)
			{
				Swap(&a[i], &a[j]);
				i++;
				j--;
			}
		}
	}


	//计数排序
	void countsort(int *a, int len)
	{
		assert(a);
		int max = a[0], min = a[0];
		for (int i = 0; i < len; i++) {
			if (a[i] > max)
				max = a[i];
			if (a[i] < min)
				min = a[i];
		}
		//b为临时数组
		int range = max - min + 1;
		int *b = (int *)calloc(range, sizeof(int));

		for (int i = 0; i < len; i++) {

			b[a[i] - min] += 1;//为b数组元素赋值,其值为该数出现的次数
		}
		int j = 0;

		for (int i = 0; i < range; i++) {
			while (b[i]--) {

				a[j++] = i + min;//按数组b中的次数顺序输出给a数组
			}
		}
		free(b);
		b = NULL;
	}

主函数Main.c

#define _CRT_SECURE_NO_WARNINGS
#include"Function.h"
int main() {
	int a[15] = { 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48 };
	printf("原数组数据为:\n");
	for (int i = 0; i < 15; i++)
		printf("%d ", a[i]);
	printf("\n计数排序结果如下:\n");
	//bubblesort(&a, 15);
	//selectsort(&a,15);
	//insertsort(&a, 15);
	//shellsort(&a, 15);
	//quicksort(&a,0,14);
	//mergesort(&a, 0, 14);
	//heapsort(&a, 15);
	//Shellsort(&a, 15);
	//doublebubble(&a, 15);
	//oddfront(&a, 15);
	countsort(&a, 15);
	for (int i = 0; i < 15; i++)
	printf("%d ", a[i]);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值