数据结构常见算法

(1)冒泡排序

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

#define LEN 10

int main()
{
	int a[LEN] = {4,3,8,7,2,6,9,1,5,0};
	
	int i,j;
	int tmp;
	
	for(i=0;i<LEN-1;i++)
	{	
		for(j=i+1;j<LEN-1-i;j++)
		{
			if(a[i]>a[j])
                   {
                       tmp = a[i];
                       a[i] = a[j];
                       a[j] = tmp;
                   }
		}
		a[j] = tmp;
	}
	
	for(i=0;i<LEN;i++)
	printf("-%d-",a[i]);	
	
	return 0;
}

(2)选择排序

 

#include <stdio.h>

#define LEN 10

int main()
{
	int a[LEN] = {4,3,8,7,2,6,9,1,5,0};
	
	int i,j;
	int min_value;
	int min_pos;
	
	for(i=0;i<LEN-1;i++)
	{
		min_value = a[i];
		min_pos = i;
		
		for(j=i+1;j<LEN;j++)
		{
			if(a[j]<min_value)
			{
				min_value = a[j];
				min_pos = j;
			}	
		}
		if(min_value<a[i])
		{
			a[min_pos] = a[i];
			a[i] = min_value;
		}
		
	}
	
	for(i=0;i<LEN;i++)
	printf("-%d-",a[i]);	
	
	return 0;
}

(3)插入排序

 

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

#define LEN 10

int main()
{
	int a[LEN] = {4,3,8,7,2,6,9,1,5,0};
	
	int i,j;
	int tmp;
	
	for(i=0;i<LEN-1;i++)
	{
		tmp = a[i+1];
		for(j=i+1;j>=0&&tmp<a[j-1];j--)
		{
			a[j] = a[j-1];
		}
		a[j] = tmp;
	}
	
	for(i=0;i<LEN;i++)
	printf("-%d-",a[i]);	
	
	return 0;
}

(4)快速排序

 

#include <stdio.h>

void fast_sort(int *array,int l ,int r)
{
	//已经递归到一个数了,不需要再排序
	if( l >= r )
		return ;
	
	int left = l;
	int right= r;
	
	//假定num的数值是最左边的数值
	int num = array[left];
	
	while( left < right )
	{
		//从数组右边开始往左边遍历,把比num要小的数值放在左边来
		while( num < array[right] && left<right)
			right--;
		array[left] = array[right];
		
		//从数组左边还是往右遍历,把比num要大的数值放在右边来
		while( num > array[left] && left<right)
			left++;
		array[right] = array[left];
	}
	
	//把num放回数组中,此时比num小的在左边,比num大的在右边
	array[left] = num;

	fast_sort(array, l ,left-1);//对num左侧剩下的数据进行快排
	
	fast_sort(array, right+1, r);//对num右侧剩下的数据进行快排

}

int main()
{
	int a[10] = {3,8,5,0,1,9,4,2,6,7};
	
	
	fast_sort(a,0,9);
	
	int k;
	for(k=0;k<10;k++)
		printf("-%d-",a[k]);
	printf("\n");

	return 0;
}

(5)希尔排序

#include <stdio.h>


void xier_sort(int *s,int n)
{
	int i,j,temp;
	
	int d;//增量
	
	//增量一开始为总长度的一半,每次结束后除以2作为下一次的增量。
	//只要增量大于0,就继续排序
	for(d=n/2 ; d>0 ; d=d/2)
	{
		//从未排序区域的第一个数值往后遍历
		for(i=d; i<n ; i++)
		{
			temp = s[i];//临时变量等于未排序区域中拿出来比较的数值
			j = i;//j是从未排序区域中拿出来比较的数值的下标
			
			if( temp < s[j-d])
			{
				while(  j-d>=0 && temp< s[j-d])
				{
					s[j] = s[j-d];
					j = j-d;
				}
				s[j]=temp;
			}
			
			// for(j=i; j-d>=0 && temp<s[j-1] ; j=j-d)
				// s[j] = s[j-d];
			
			s[j] = temp;
			
		}
	}
}

int main()
{
	int a[10] = {3,8,5,0,1,9,4,2,6,7};
	
	xier_sort(a,10);
	
	int k;
	for(k=0;k<10;k++)
		printf("-%d-",a[k]);
	printf("\n");

	
	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值