常见排序算法

1、冒泡排序

#include<stdio.h>
 void main(){
	 int i,j;
	int s[10]={10,2,34,24,15,89,100,1,50,90};
	for( i=0;i<10;i++)
		printf("%d ",s[i]);
		printf("\n");				//输出排序前
	
	for(i=0;i<10;i++){
		for(j=0;j<9;j++){
			if(s[i]<s[j]){
			 int temp = s[i];
			 s[i] = s[j];
			 s[j] = temp;
			}
		}
	}

	for(i=0;i<10;i++)
		printf("%d ",s[i]);
			printf("\n");			//输出排序后
 }
2、直接插入排序
#include<stdio.h>
 void main(){
	 int i,j,temp;
	int s[10]={10,2,34,24,15,89,100,1,50,90};
	for( i=0;i<10;i++)
		printf("%d ",s[i]);
		printf("\n");				//输出排序前
	
	for(i=0;i<10;i++){
		temp = s[i];				 //当前操作元素
		for(j=i-1;j>=-1&&s[j]>temp;j--){
			s[j+1] = s[j];
			s[j] = temp;
		}
	}

	for(i=0;i<10;i++)
		printf("%d ",s[i]);
			printf("\n");			//输出排序后
 }
3、希尔排序
#include<stdio.h>
 void main(){
	 int i,j,temp,gap;
	int s[10]={10,2,34,24,15,89,100,1,50,90};
	for( i=0;i<10;i++)
		printf("%d ",s[i]);
		printf("\n");								//输出排序前
	
	for(gap=10/2;gap>0;gap/=2){   //gap表示步长,每次减半,直到减到1
		for(i=gap;i<10;i++){				//定位到每一个元素
		    for(j=i-gap;(j>=0)&&(s[j]>s[j+gap]);j-=gap)
				//比较相距gap远的两个元素的大小,根据排序方向决定如何调换 
			{
				temp = s[j];
				s[j] = s[j+gap];
				v[j+gap] = temp;
			}
		}							
		
	}

	for(i=0;i<10;i++)
		printf("%d ",s[i]);
			printf("\n");			//输出排序后
 }

4、快速排序

/*
先找到第一个数--10,把它作为中间值,也就是说,要把10放在一个位置,
使得它左边的值比它小,右边的值比它大。这样一个数组的排序就变成了
两个小数组的排序--10左边的数组和10右边的数组,而这两个数组继续用
同样的方式继续下去,一直到顺序完全正确。
*/

#include<stdio.h>
void quicksort(int a[],int left,int right)
{
   int i,j,temp;
   i=left;
   j=right;
   temp=a[left];
   if(left>right)
    return;
   while(i!=j)
   {
      while(a[j]>=temp&&j>i)				//发现左边有大于temp的数,则交换
		 j--;
     if(j>i)
          a[i++]=a[j];
     while(a[i]<=temp&&j>i)				//发现右边有小于temp的数,则交换
      i++;
     if(j>i)
      a[j--]=a[i];
   
   }
   a[i]=temp;
   quicksort(a,left,i-1);
   quicksort(a,i+1,right);
}

 void main(){
	 int i;
	int s[10]={10,2,34,24,15,89,100,1,50,90};
	for( i=0;i<10;i++)
		printf("%d ",s[i]);
		printf("\n");								//输出排序前
		quicksort(s,0,9);
	
	for(i=0;i<10;i++)
		printf("%d ",s[i]);
			printf("\n");			//输出排序后
 }
5、选择排序

#include<stdio.h>
 void main(){
	 int i,j,min;
	int s[10]={10,2,34,24,15,89,100,1,50,90};
	for( i=0;i<10;i++)
		printf("%d ",s[i]);
		printf("\n");				//输出排序前
		
		for(i=0;i<10;i++){
			min=i;
			for(j=i+1;j<10;j++){  // 从j往前的数据都是排好的,所以从j开始往下找剩下的元素中最小的
				if(s[min]>s[j]){       //把剩下元素中最小的那个放到A[i]中 
					int temp = s[i];
						s[i] = s[j];
						s[j] = temp;
				}
			}
		}
	
	for(i=0;i<10;i++)
		printf("%d ",s[i]);
			printf("\n");			//输出排序后
 }
6、二分插入排序

#include <stdio.h>
void HalfInsertSort(int a[], int len)
{
     int i, j,temp;
     int low, high, mid;
     for (i=1; i<len; i++)
     {
          temp = a[i];							// 保存但前元素
          low = 0;
          high = i-1;
          while (low <= high)				    //在a[low...high]中折半查找有序插入的位置
          {
               mid = (low + high) / 2;		    // 找到中间元素 
               if(a[mid] > temp){			    // 如果中间元素比但前元素大,当前元素要插入到中间元素的左侧
				 high = mid-1;
               }else{						    // 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧
                low = mid+1;
			   }
           }								    // 找到当前元素的位置,在low和high之间 
          for (j=i-1; j>high; j--)				// 元素后移 
            a[j+1] = a[j];
          a[high+1] = temp;						// 插入
     }
}

 void main(){
	 int i;
	int s[10]={10,2,34,24,15,89,100,1,50,90};
	for( i=0;i<10;i++)
		printf("%d ",s[i]);
		printf("\n");				//输出排序前
	
		HalfInsertSort(s,10);

	for(i=0;i<10;i++)
		printf("%d ",s[i]);
			printf("\n");			//输出排序后
 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值