常见排序算法及实现

关于冒泡最优情况说明一下,O(n)是指在使用标志情况下,否则仍是O(n)。

冒泡排序:

//本人习惯先把最大的选出来,放到右边
void maopao(int arr[],int n)
{
	int i,j,tmp;//tmp提前写上,或者及时补上!
	for (i=n-1;i>=0;i--)//不能少写等号!
	for(j=0;j<i;j++)
	{
		if(arr[j]>arr[j+1])//不比较等于情况!否则就不稳定了!
		{
			tmp=arr[j+1];
			arr[j+1]=arr[j];
			arr[j]=tmp;
		}
	}
	return;
}

 

使用标志的冒泡排序,最好可达到O(n):

void bubble_sort(int d[], int size)
{
	//假定两两交换发生在数组最后的两个位置
	int exchange = size - 1;
 	while(exchange)
	{                
                int bound = exchange;//记录下发生数据交换的位置
                 exchange = 0; //假定本趟比较没有数据交换
                 for(int i = 0; i < bound; i++)
                {
                        if (d[i] > d[i + 1])//交换
                        {                       
                                int t = d[i];
                                d[i] = d[i + 1];
                                d[i + 1] = t;
                                 exchange = i + 1;
                        }
                }
        }
}

快速排序:

void fast(int arr[],int left,int right)
{
	int i,j,k;

	if(left<right){
	i=left+1;j=right;

	while(i<j){
		while(arr[i]<arr[left]&&i<right)i++;//
		while(arr[j]>arr[left]&&j>left)j--;//
		if(i<j) swap(&arr[i],&arr[j]);//大部分时候必要,最后那次在循环外完成
	};

	swap(&arr[j],&arr[left]);//
	fast(arr,left,j-1);
	fast(arr,j+1,right);
	}	
	return;
}

插入排序:

void insert(int arr[],int n)
{
	int i=0,j=0,k=0,tmp;
	for(i=1;i<=n-1;i++)
	{	
		for(j=i-1;j>=0;j--)//忘记写=0了,结果gdb半天才发现!
		{
			if(arr[j]>arr[j+1])//
				swap(&arr[j],&arr[j+1]);
			else
				break;
		}

	}
	return;
}

选择排序:

void select1(int arr[],int n)
{
	int i=0,c=0,j=0;
	int place,min;//
	for(i=0;i<n;i++)
	{	min=arr[i];;//切莫忘记每次初始化,否则各种奇怪错误!仅在外面初始化为0还不够!	
		for(j=i+1;j<=n;j++)
			if (arr[j]<min)
			{
				min=arr[i];place=j;
			}
		if(place!=i)
			swap(&arr[i],&arr[place]);
	}
	return;
}

void select2(int arr[],int n)
{
	int i=0,c=0,j=0,place=0,min=0;
	min=arr[1];
	for(i=c;i<n;i++)
	{	for(j=i+1;j<=n;j++)
			if (arr[j]<min)
				{min=arr[i];place=j;}
		swap(&arr[i],&arr[place]);		
		c++;
	}
	return;
}

 

posted @ 2012-09-29 22:23  aitao  阅读(704)  评论(0编辑  收藏  举报