关于排序(冒泡、选择、插入、快速)的几种算法

废话不说,直接上代码

1.冒泡排序

#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])//这里容易出现问题,数组做参数 LEN 可能为1

void swap(int *p, int *q)
{
	int temp = *p;
	*p = *q;
	*q = temp;
}

void bubble_sort(int arr[])//数组作参数时,可以看作指针(arr[] <=> *arr)
{
	int i,j;
	for(i=0;i<10;i++)
	{
		for(j=0;j<10;j++)
		{
			if(arr[j]>arr[j+1])
			{
				swap(&arr[j], &arr[j+1]);
			}
		}
	}
}

void main()
{
	int arr[] = {3, 9, 2, 7, 10, 8, 4, 6, 5, 1};
	int i;
	
	bubble_sort(arr);
	
	for(i=0;i<LEN;i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
2.选择排序(和冒泡差不多)

#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])
void arr_print(int arr[], int len)
{
	int i;
	for (i=0;i<len;i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void swap(int *p, int *q)
{
	int temp = *p;
	*p = *q;
	*q = temp;
}
void select_sort(int *arr, int len)
{
	int i, j, min_idx;
	for(i=0;i<len;i++)
	{
		min_idx = i;	
		for(j=i;j<len;j++)
		{
			if(arr[j]<arr[min_idx])	
			{
				min_idx = j;
			}
		}
		swap(&arr[i], &arr[min_idx]);
	}
}
void main()
{
	int arr[] = {3, 9, 2, 7, 10, 8, 4, 6, 5, 1};
	
	select_sort(arr, LEN);
	arr_print(arr, LEN);
}

3.插入排序(这个编译没问题,思路是对的,就是不通过,不知为什么)

#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])

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

void intsert_sort(int arr[])
{
	int i;//有序当中的最后一个	
	int j;//无序当中的第一个
	int temp;
	for (j=1; j<10; j++)
	{		
		temp = arr[j];	
		for(i=j-1; i>=0 && temp<arr[i]; i--)	
		{
			arr[i+1] = arr[i];
		}
		arr[i+1] = temp;
	}	
}

void main()
{
	int arr[] = {2, 9, 3, 7, 10, 8, 4, 6, 5, 1};
	
	intsert_sort(arr);
	arr_print(arr, LEN);
}

4.快速排序

#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])

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

void quick_sort(int arr[], int len)
{
	if (len == 0 || len == 1)
		return ;
	int l = 0;
	int r = len-1;
	int pivot_idx = len/2;
	int pivot = arr[pivot_idx];
	
	for (; l<r && arr[l]<pivot; l++)
		;
	for (; arr[r]>pivot && r>l; r--)
		;
	
	arr[pivot_idx] = arr[l];
	
	while(l<r)
	{
		arr[l]=arr[r];
		for (; arr[l]<pivot && l<r; l++)
			;
		arr[r]=arr[l];
		for (; arr[r]>pivot && r>l; r--)
			;
	}
	arr[l] = pivot;
	
	quick_sort(arr, l);
	quick_sort(arr+l+1, len-l-1);
		
}

void main()
{
	int arr[] = {2, 10, 3, 5, 6, 9, 4, 7, 8, 1};
	
	quick_sort(arr, LEN);
	
	arr_print(arr, LEN);
}


5.shell 法

void shell_sort(int arr[])
{
	int i, j, temp, x, step;

	int steps[3] = {5, 3, 1};

	for (x = 0; x < 3; x++)
	{
		step = steps[x];
		for (j = 1; j < 10; j++)
		{
			temp = arr[j];
			for (i = j-step; 
					i >= 0 && temp < arr[i];
					i -= step)
			{
				arr[i+step] = arr[i];
			}
			arr[i+step] = temp;
		}
	}
}


6.

void merge_sort(int arr[], int len)
{
	if (len == 0 || len == 1)
		return ;
	
	// left part of cur arr
	merge_sort(arr, len/2);

	// right part of cur arr
	merge_sort(arr+len/2, len-len/2);

	int temp[len];	

	int l = 0;
	int r = len/2;

	int i = 0;	
	while (l < len/2 && r < len)
	{
		if (arr[l] < arr[r])
			temp[i++] = arr[l++];
		else
			temp[i++] = arr[r++];
	}

	while (l < len/2)
		temp[i++] = arr[l++];
	while (r < len)
		temp[i++] = arr[r++];

	for (i = 0; i < len; i++)
		arr[i] = temp[i];

	return ;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值