天天看點

算法設計與分析————找出數組中最大值和次大值的14鐘方法

1. 一次循環查找

#include<stdio.h>
//找到最大的元素和次大的元素 
void find(int a[],int b[])
{
	int max1=a[0];
	int max2=-1000,t;
	for(int i=0;i<6;i++)
	{
		if(a[i]>max2)
		   if(a[i]>max1)
	           max2=a[i];   
           else
           {
		  	 max2=max1;
		  	 max1=a[i];
			           }
	
	}
	b[0]=max1;
	b[1]=max2;
}


int main()
{
	int b[2]={0,0};
	int a[]={2,5,1,4,6,3}; 
	find(a,b);
	printf("最大值為%d",b[0]);
	printf("\n");
	printf("次大值為%d",b[1]);
 } 
           

2.兩次循環查找

#include<stdio.h>
//找到最大的元素和次大的元素 
void find(int a[],int b[])
{
	int max=a[0];
	int max1=0;
    for(int i=0;i<6;i++)
    {
    	if(a[i]>max)
           max=a[i];
	}
	for(int i=0;i<6;i++)
	{
		if(a[i]<max&&a[i]>max1)
		   max1=a[i];
	}
	b[0]=max;
	b[1]=max1;
}


int main()
{
	int b[2]={0,0};
	int a[]={2,5,1,4,6,3}; 
	find(a,b);
	printf("最大值為%d",b[0]);
	printf("\n");
	printf("次大值為%d",b[1]);
 } 
           

3.減1排序

#include<stdio.h>

void sort(int a[],int n)
{
	int p;
	int k=0;
	int b[n],c[n];
	for(int i=0;i<n;i++)
	 {
	   b[i]=a[i];
	   c[i]=a[i];
     }
     printf("\n");

while(k<n)
{         
     for(int i=0;i<n;i++)
	 {
	    b[i]=b[i]-1;
	    if(b[i]==0)
	 	  a[k++]=c[i];
	 }	   
}
}

int main()
{
	int a[]={2,5,1,4,6,3};
	int n=sizeof(a)/sizeof(a[0]);
	printf("排序前,數組為");
	for(int i=0;i<6;i++) 
	printf("%d",a[i]);
	sort(a,n);
	printf("排序後,數組為");
	for(int i=0;i<6;i++)
	printf("%d",a[i]);
	printf("\n");
	printf("最大值為%d",a[n-1]);
	printf("\n");
	printf("次大值為%d",a[n-2]);
	return 0;
}  
           

4.簡單選擇排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
#include<stdio.h>

void sort(int a[],int n)
{
	int t;
	for(int i=0;i<n-1;i++)
	{
	   for(int j=i+1;j<n;j++)
	   {
	   	   if(a[j]>a[i])
	    {
	   	      t=a[j];	
	   		  a[j]=a[i];
	   		  a[i]=t;
		      }
	   } 
    }
}



int main()
{
	int a[]={2,5,1,4,6,3}; 
	sort(a,6);
	printf("最大值為%d",a[0]);
	printf("\n");
	printf("次大值為%d",a[1]);
 }  
           

5.冒泡排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
#include<stdio.h>

void sort(int a[],int n)
{
	int t;
    for(int i=0;i<n;i++)
        for(int j=0;j<n-i-1;j++) 
		  	if(a[j+1]>a[j])
		  	{
		  	     t=a[j];
		  	     a[j]=a[j+1];
		  	     a[j+1]=t;
			}
}

int main()
{
	int a[]={2,5,1,4,6,3}; 
	sort(a,6);
	printf("數組為");
	for(int i=0;i<6;i++)
	printf("%d",a[i]);
	printf("\n");
	printf("最大值為%d",a[0]);
	printf("\n");
	printf("次大值為%d",a[1]);
 }  
           

6.直接插入排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
#include<stdio.h>

void sort(int a[],int n)
{
	int i,j;
    for(i=2;i<n;i++)
	{
		a[0]=a[i];
		j=i-1;
		while(a[0]>a[j])
		{
		   a[j+1]=a[j];
		    j--;
		}
		a[j+1]=a[0];
	 } 
}

int main()
{
	int a[]={-100,2,5,1,4,6,3}; 
	printf("排序前數組為");
	for(int i=1;i<=6;i++)
	printf("%d",a[i]);
	printf("\n");
	sort(a,7);
	printf("排序後數組為");
	for(int i=1;i<=6;i++)
	printf("%d",a[i]);
	printf("\n");
	printf("最大值為%d",a[1]);
	printf("\n");
	printf("次大值為%d",a[2]);
 }  
           

7.折半插入排序

#include<stdio.h>

void sort(int r[],int length)
{
  int x;
  int mid;
  for(int i=2;i<=length;i++)//從第2個值開始,不斷插入 
  {
   	x=r[i];//将插入值存放在x中 
	int low=1;
	int high=i-1;//high表示上一次數組的最後一個位置的值 
	while(low<=high) 
	{
		mid=(low+high)/2; 
		if(x<r[mid])  //比較與中間值的大小關系 
		  high=mid-1;
		else
		  low=mid+1;
	}
	for(int j=i-1;j>=low;j--)//将所有的後面的值向前挪 
	   r[j+1]=r[j]; 
	r[low]=x;//在low處放入數之 
  }
}

int main()
{
	int a[]={0,2,5,1,4,6,3};
	int n=sizeof(a)/sizeof(a[0]);
	printf("排序前數組為");
	for(int i=1;i<7;i++)
	printf("%d ",a[i]);
	sort(a,n);
	printf("\n");
	printf("排序後數組為");
	for(int i=1;i<7;i++)
	printf("%d ",a[i]);
	printf("\n");
	printf("最大值為%d",a[n-1]);
	printf("\n");
	printf("次大值為%d",a[n-2]);
	return 0;
 } 
           

8.快速排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
//快速排序 
#include<stdio.h>
#include<malloc.h> 
 
int part(int a[],int s,int t) 
{
	int *b;
    int i,j;
    int k=s;
	int mid=a[s];	
    i=s;
  	j=t;
 	b=(int*)malloc((t-s+1)*sizeof(int));
 	for(int k=s+1;k<=t;k++)
 	{
 	    if(a[k]<mid)
		  b[j--]=a[k];
	    else
	      b[i++]=a[k];
 	}
 	b[i]=mid;
 	for(int v=s;v<=t;v++)
 	    a[v]=b[v];
 	free(b);
 	return i;
}
 
void sort(int a[],int s,int t)
{
	int i;
	if(s<t)
	{
	   i=part(a,s,t);
       sort(a,s,i-1);
       sort(a,i+1,t);
    } 
}


int main()
{
	int a[]={-100,2,5,1,4,6,3}; 
	printf("排序前數組為");
	for(int i=1;i<=6;i++)
	printf("%d ",a[i]);
	printf("\n");
	sort(a,1,6);
	printf("排序後數組為");
	for(int i=1;i<=6;i++)
	printf("%d ",a[i]);
	printf("\n");
	printf("最大值為%d",a[1]);
	printf("\n");
	printf("次大值為%d",a[2]);
 }  
           

9.歸并排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
//歸并排序
#include<stdio.h>
#include<malloc.h>

void merge(int a[],int low,int mid,int high)
{
	int i=low;
	int j=mid+1;
	int k=0;
	int *temp;
	temp=(int *)malloc((high-low+1)*sizeof(int));
	while(i<=mid&&j<=high)
	{
	   if(a[i]<a[j]) 
	   	 temp[k++]=a[i++];
	   else
	   	 temp[k++]=a[j++];
	}
	
	 while(i<=mid)
	 	temp[k++]=a[i++]; 
	 	
	 while(j<=high)
	 	temp[k++]=a[j++];
	 	
	for(int i=low,k=0;i<=high;i++)
	   a[i]=temp[k++];
	   	
	free(temp);
}


void sort(int a[],int low,int high)
{
	int mid;
	if(low<high)
	{
		mid=(low+high)/2;
		sort(a,low,mid);
		sort(a,mid+1,high);
		merge(a,low,mid,high);
	}
}



int main()
{
	int a[]={-100,2,5,1,4,6,3}; 
	printf("排序前數組為");
	for(int i=1;i<=6;i++)
	printf("%d ",a[i]);
	printf("\n");
	sort(a,1,6);
	printf("排序後數組為");
	for(int i=1;i<=6;i++)
	printf("%d ",a[i]);
	printf("\n");
	printf("最大值為%d",a[6]);
	printf("\n");
	printf("次大值為%d",a[5]);
 }   
           

10.希爾排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
#include<stdio.h>

void sort(int a[],int n)
{
	 int i,j,gap,temp,k;
	 printf("%d",n);
     for(gap=n/2;gap>=1;gap/=2)	
	 {
	    for(i=0;i<gap;i++) 	
	 	{
	 	   for(j=i+gap;j<n;j+=gap)	
	 		{
	 			if(a[j-gap]>a[j])
	 		   {
	 		    temp=a[j];	
	 			for(k=j-gap;k>=0&&a[k]>temp;k-=gap)
	 			    a[k+gap]=a[k];
	 			a[k+gap]=temp;
	        	}
			 }
		 }
	 }
} 


int main()
{
	int a[]={2,5,1,4,6,3};
	int n=sizeof(a)/sizeof(a[0]);
	sort(a,n);
	printf("數組為");
	for(int i=0;i<6;i++)
	printf("%d",a[i]);
	printf("\n");
	printf("最大值為%d",a[n-1]);
	printf("\n");
	printf("次大值為%d",a[n-2]);
	return 0;
 }  
           

11.堆排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
#include<stdio.h>

void head_adjust(int* arr,int s,int m) // 一個交換的過程 
{
	int temp=arr[s];  //将要交換的值存起來 
	for(int j=2*s+1;j<=m;j=2*j+1) //挑出目前層的最大值 
	{
		if(j<m&&arr[j]<arr[j+1])//選擇兩個中較大的                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
		     ++j;            //左邊小的話選右邊 
		if(temp>=arr[j])//如果有一個值超過了arr[j],兩者進行一次交換 
		    break;
		arr[s]=arr[j];//交換1 
		s=j;   //記錄j的小标 
	}
	arr[s]=temp; //交換2
 } 
 
void  swap(int a,int b)  //将兩個數字進行交換 
{	
    int t;
     t=a;
     a=b;
     b=t;
} 
 
 void sort(int *arr,int len)  
 {
 	for(int i=(len-1)/2;i>=0;i--)//建立一個大頂堆 //保證n-1層滿足即可 
 	{
 		head_adjust(arr,i,len-1); //
	 }
 	for(int i=len-1;i>0;i--)//進行堆排序 
 	{
 		swap(arr[0],arr[i]);//每次與将其中的一個值與a[0]交換,破壞頂堆 
 		head_adjust(arr,0,i-1);//堆頂元素和堆底元素交換,使用的大頂堆 
	 }
 }
 
 int main()
{
	int a[]={2,5,1,4,6,3};
	int n=sizeof(a)/sizeof(a[0]);
	printf("排序前數組為");
	for(int i=0;i<6;i++)
	printf("%d ",a[i]);
	sort(a,n);
	printf("\n");
	printf("排序後數組為");
	for(int i=0;i<6;i++)
	printf("%d ",a[i]);
	printf("\n");
	printf("最大值為%d",a[0]);
	printf("\n");
	printf("次大值為%d",a[1]);
	return 0;
 } 
           

12.桶排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
//快速排序 
#include<stdio.h>
#define N  100 

void  sort(int a[],int n)
{
   int k=0; 
   int bucket[N];
   
   for(int i=0;i<N;i++)
      bucket[i]=0;
      
    for(int i=0;i<n;i++)
      bucket[a[i]]=1;
      
    for(int i=0;i<N;i++)
      for(int j=0;j<bucket[i];j++)
           a[k++]=i;         
}
        
int main()
{
	int a[]={2,5,1,4,6,3}; 
	int n=sizeof(a)/sizeof(a[0]);
	printf("排序前數組為");
	for(int i=0;i<6;i++)
	printf("%d ",a[i]);
	printf("\n");
	
	sort(a,n);
	
	printf("排序後數組為");
	for(int i=0;i<6;i++)
	printf("%d ",a[i]);
	printf("\n");
	
	printf("最大值為%d",a[n-1]);
	printf("\n");
	printf("次大值為%d",a[n-2]);
 }  
           

13.計數排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
#include<stdio.h>


void sort(int a[],int n)
{
    int max=a[0],min=a[0];	
	for(int i=0;i<n;i++) //挑選最大,最小值 
	{
	   if(a[i]>max)
	    {
	     max=a[i];	
		 }
		if(a[i]<min)
		{
		 min=a[i];
		 } 
	}
	
   int k=max-min+1;
   int c[k]={0};  //建立計數數組 
   
   
   for(int i=0;i<n;i++)  //計數 
   {
   	 c[a[i]-min]+=1;
   }
   
     
   int j=0;
   for(int i=0;i<k;i++)
   {
   	  while(c[i]>0)
   	  {
   	  	a[j]=i+min;
   	  	j++;
   	  	c[i]--;
	  }  	
   }
}

int main()
{
	int a[]={2,5,1,4,6,3}; 
	int n=sizeof(a)/sizeof(a[0]);
	printf("排序前數組為");
	for(int i=0;i<6;i++)
	printf("%d ",a[i]);
	printf("\n");
	
	sort(a,n);
	
	printf("排序後數組為");
	for(int i=0;i<6;i++)
	printf("%d ",a[i]);
	printf("\n");
	
	printf("最大值為%d",a[n-1]);
	printf("\n");
	printf("次大值為%d",a[n-2]);
 }  
           

14.基數排序

算法設計與分析————找出數組中最大值和次大值的14鐘方法
#include<stdio.h>
#include<stdlib.h>

void RadixCountSort(int *index,int *a,int len)
{
	int i;
	int *count=(int *)malloc(sizeof(int)*10);
	
	for(i=0;i<10;i++)  //計數數組為0 
	  count[i]=0;
	  
	for(i=0;i<len;i++)   //記錄索引對應标記 
	    count[index[i]]++;  
	    
	for(i=1;i<10;i++)         //将數字累加 
	    count[i]=count[i]+count[i-1];
	
	int *sort=(int *)malloc(sizeof(int)*len);  //建立一個臨時數組空間 
	
	for(i=len-1;i>=0;i--)        //倒序輸出 
	{
		count[index[i]]--;        //對應位置-1 
		sort[count[index[i]]]=a[i];   //放入對應的數組 
	}
	//index[i]值-----sort----count[]下标   
	
	
	for(i=0;i<len;i++)
	  a[i]=sort[i];
	  
	free(sort);
	free(count);
 } 
 
 void RadixSort(int *a,int len)
 {
 	int i,x=1;
 	int tmp=1;
 	int *radix=(int *)malloc(sizeof(int)*len);//建立一個單個位數的數組 (同為個位,十位,或百位) 
 	
 	while(x) //當x不等于0時 
 	{
 		tmp=tmp*10;
 		x=0;
 		
 		for(i=0;i<len;i++)
 		{                           //舉例當a[i]=123       
 			radix[i]=a[i]%tmp;  //           3    23    123   123
 			radix[i]=radix[i]/(tmp/10); //   3     2     1     0
 			if(a[i]/tmp>0)//如果對應還存在不為0的商,繼續循環 
 			{
 				x=1;
			 }
		 }
		 RadixCountSort(radix,a,len);//是數組a發生變化,本輪的a将會排好 
      //同位數的比較,當a排好之後,位數相同的就排好了 
	 // 不位數的比較,位數不同的以0做區分 
	 }
	 free(radix);
 }
 
 int main()
 {
 	int i,len;
 	int a[]={2,5,1,4,6,3}; 
 	len=sizeof(a)/sizeof(int);
 	printf("排序前,數組為"); 
 	for(i=0;i<len;i++)
 		printf("%d ",a[i]);
 		
 	printf("\n");
 	RadixSort(a,len);
 	
 	printf("排序後,數組為"); 
 	for(i=0;i<len;i++)
 		printf("%d ",a[i]);
 		
    printf("\n");
	printf("最大值為%d",a[len-1]);
	printf("\n");
	printf("次大值為%d",a[len-2]);
	return 0;	
 }
 
 
           

繼續閱讀