十大排序方法(c语言)


//冒泡排序
void BubbleSort( int n){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n-i-1; j++){
            if(arr[j + 1] < arr[j]){
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}
//选择排序1
void SelectSort_1( int n){
	for (int i = 0; i < n; ++i)
	{
		for (int j = i; j < n; ++j)
		{
			if(arr[i] > arr[j]){
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
}


//选择排序2
void SelectSort_2( int n){
	for (int i = 0; i < n; i++)
	{
		int k = i;
		for (int j = i + 1 ; j < n; j++)
		{
			if(arr[j] < arr[k]){
				k = j;
			}
		}
		int temp = arr[i];
		arr[i] = arr[k];
		arr[k] = temp;
	}
}
//快速排序
void QuickSort(int left, int right){
	int i = left;
	int j = right;
	int mid = arr[(left+right)/2];
	while(i <= j){
		while(arr[i] < mid) i++;
		while(arr[j] > mid) j--;
		if(i <= j){
			int temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
			i++;
			j--;
		}
	}
	if(i < right) QuickSort(i, right);
	if(j > left) QuickSort(left, j);
}


//插入排序
void InsertSort(int n){
	int preIndex, curData;

	for(int i = 1; i < n; i++){
		preIndex = i - 1;
		curData = arr[i];
		while(preIndex >= 0 && arr[preIndex] > curData){
			arr[preIndex + 1] = arr[preIndex];
			preIndex--;
		}
		arr[preIndex + 1] = curData;
	}
}


//局限的归并排序

void Merge(int fBegin, int fEnd, int sBegin, int sEnd, int newarr[]){
	for(int i = 0; i < 10; i++){
		printf("%d", arr[i]);
	}
	printf("\n");
	int index = fBegin;
	int f = fBegin;
	int s = sBegin;
	while(f <= fEnd && s <= sEnd){
		if(arr[f] <= arr[s]){
			newarr[index++] = arr[f++];
		}else{
			newarr[index++] = arr[s++];
		}
	}
	while(f <= fEnd){
		newarr[index++] = arr[f++];
	}
	while(s <= sEnd){
		newarr[index++] = arr[s++];
	}
	memcpy(arr + fBegin, newarr + fBegin, sizeof(int) *(sEnd - fBegin + 1));
}
// void Mergetest(){
// 	int result[10];
// 	Merge(0, 4, 5, 9,result);
// 	for(int i = 0; i < 10; i++){
// 		printf("%d", result[i]);
// 	}
// 	printf("\n");
// }
void mergeSort(int left, int right, int newarr[]){
	if(left >= right)
		return;
	int mid = (left + right) / 2;
	mergeSort(left, mid, newarr);
	mergeSort(mid + 1, right, newarr);
	Merge(left, mid, mid+1, right, newarr);
}
void MergeSort(int n){
	int *temp = (int *)malloc(sizeof(int) *n);
	if(temp == NULL){
		return;
	}
	mergeSort(0, n-1, temp);
	free(temp);
}


//希尔排序

void ShellSort(int n){
 	int i, j, gap;
 	for(gap = n/2; gap > 0; gap /= 2)
 	{
 		for(i = 0; i < n; i++)
 		{
 			int temp = arr[i];
 			for(j=i-gap;j>=0 && arr[j] > temp;j-=gap)
 			{
 				arr[j + gap] = arr[j];
 			}
 			arr[j + gap] = temp;
 		}
 	}

 }
//计数排序

void CountSort(int n){
	int i, j, k;
	int count[100] = {0};
	for(i = 0; i < n; i++)
	{
		count[arr[i]]++;
	}

	k=0;
	for(i = 0; i < 100; i++)
	{
		for(j = 0; j < count[i]; j++)
		{
			arr[k++] = i;
		}
	}
}


//桶排序
void BucketSort(int n)
{
	int max = 0;
	for (int i = 0; i < n; ++i)
	{
		if(max < arr[i])
		{
			max = arr[i];
		}
	}
	int buckets[max];
	memset(buckets, 0, max * sizeof(int));
	for (int i = 0; i < n; ++i)
	{
		buckets[arr[i]]++;
	}
	for (int i = 0, j = 0; i < max; ++i)
	{
		while((buckets[i]--)>0)
			arr[j++] = i;
	}
}


//堆排序
void Heapify(int start, int end)
{
	int dad = start ;
	int son = dad * 2 +1;
	while(son <= end)
	{
		if((son + 1 < end) && (arr[son] < arr[son + 1]))
			son++;
		if(arr[dad] > arr[son])
			return;
		int temp = arr[dad];
		arr[dad] = arr[son];
		arr[son] = temp;
		dad = son;
		son = dad * 2 +1;
	}
}

void HeapSort(int n)
{
	int i;
	for (i = (n-1) / 2; i >=0; i--)
	{
		Heapify(i, n-1);
	}
	for (i = n - 1; i > 0; i--)
	{
		int temp = arr[i];
		arr[i]	= arr[0];
		arr[0] = temp;
		Heapify(0, i - 1);
	}
}



//基数排序

void _RadixSort(int n;int exp)
{
	int i;
	int result[n];
	int buckets[10] = {0};
	for(i = 0; i < len; i++)
	{
		buckets[(arr[i] / exp) % 10]++;
	}
	for(i = 0; i < 10; i++)
	{
		buckets[i] = buckets[i] + buckets[i-1];
	}
	for(i = len-1; i > 0; i--)
	{
		int iexp = (arr[i] / exp) % 10;
		result[buckets[iexp] - 1] = arr[i];
		buckets[iexp]--;
	}
	memcpy(arr, result, len*sizeof(int));
}
void RadixSort(int n)
{     int imax = RadioMax(n);     int iexp;     for(iexp = 1; imax / iexp > 0; iexp = iexp*10)     {         _RadixSort(len, iexp);         int y;         printf("exp = %-5d ", iexp);         for(y = 0; yy < len; y++)             printf("%2d", arr[y]);         printf("\n");     }
}

主函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int arr[100];
int n;

int main(int argc, char const *argv[])
{
	printf("请输入元素个数: ");
	scanf("%d", &n);
	printf("请输入元素:\n");
	for(int i = 0; i < n; i++){
		scanf("%d", &arr[i]);
	}

	// BubbleSort(n);

	// SelectSort_1(n);

	// SelectSort_2(n);

	// QuickSort(0, n-1);

	// InsertSort(n);
	
	// Mergetest();

	// MergeSort(n);

	// ShellSort(n);

	// CountSort(n);

	// BucketSort(n);

	//HeapSort(10);

	printf("排序后:\n");
	for(int i = 0; i < n; i++){
		printf("%-2d", *(arr+i));
	}
	return 0;
}



全部评论
都是面试常考的点啊
点赞 回复 分享
发布于 2022-08-03 15:47

相关推荐

牛客83265014...:完了,连现在都没开始面,13号投的是不是晚了
秋招的第一个offer,...
点赞 评论 收藏
分享
牛牛不会牛泪:脉脉太多这种了,纯水军
点赞 评论 收藏
分享
评论
1
14
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务