C語言第六次上機實驗

 時間複雜度 -插入,選擇,冒泡,O(n2) --歸併O(nlogn)

插入排序:先對數列最左2個數據排序,再把第三個加進來..接着第四個......

代碼實現:

#include<stdio.h>
int main(void)
{
	int len,i,j,Q;//Q爲標記,
	scanf("%d",&len); 
	int arr[len];
	for(i=0;i<len;i++)scanf("%d",&arr[i]);
	for(i=1;i<len;i++)
	{
		Q=arr[i];//要插入的元素
		for(j=i-1;j>=0;j--) 
		{
			if(arr[j]>Q)
				arr[j+1]=arr[j];//Q之前的都是有序的,所以,就是找一個比Q小的,或者沒有,
			else break;//找到了 
		}
		arr[j+1]=Q;
	}
	for(i=0;i<len;i++)printf("%d\n",arr[i]);
	
}

簡而言之就是不斷的把一個個元素加到之前已經排好的有序數列中去;






選擇排序:先第一個元素和之後所以元素比較,遍歷,符合條件就交換;再第二個元素和之後的所以元素遍歷比較..依次..

代碼實現:

for(i=0;i<len;i++)
	
	for(j=i+1;j<len;j++)
		
		if(arr[i]>arr[j])   //如果前面的比後面的大,兩者交換 
		{
			temp=arr[i];
			arr[i]=arr[j];
			arr[j]=temp;
		}
	

懶了,沒寫全,






冒泡排序: 選擇排序是 第一個點不動,和後面遍歷比較,第二個點不動..依次.而冒泡則是,第一個和第二個比.大的往後,第二個和第三個比,,大的往後..依次,感覺就像是把大的泡往後面推..

代碼實現

#include<stdio.h>
int main(void)
{
	int i,j,len,temp;
	scanf("%d",&len);
	int arr[len];
	
	i=len;        //獲取數據 
	while(i--)scanf("%d",&arr[len-i-1]);
	 
    for(i=0;i<len-1;i++)
    	for(j=0;j<len-1-i;j++)
    		if(arr[j]>arr[j+1])
    		{
	    		temp=arr[j];
	    		arr[j]=arr[j+1];
	    		arr[j+1]=temp;
	    	}
    	for(i=0;i<len;i++)printf("%d\n",arr[i]);
}

這裏有一個簡單的優化方法,就是一次下來沒有發生一次交換,那就直接結束排序;







合併排序:適合規模比較大的排序,遞歸形式:遞歸體-(把整個數組一分爲二,對左數組排序,對右數組排序,合併);

代碼實現:

#include<stdio.h>
#include<stdlib.h>
void sort(int arr[],int left,int right);
void merge(int arr[],int left,int right);
int main(void)
{
	int n;
	scanf("%d",&n);
	int arr[n];
	for(int i=0;i<n;i++)scanf("%d",&arr[i]);
	sort(arr,n/2,n-n/2);
	for(int i=0;i<n;i++)printf("%d\n",arr[i]);
	return 0;
}

void sort(int arr[],int left,int right)
{
	
	if(left>1){
		sort(arr,left/2,left-left/2);
		sort(arr+left,right/2,right-right/2);
		merge(arr,left,right);
	}
	if(left==1)
		{
			if(right==2){
				merge(arr+1,1,1);
				merge(arr,1,2);
				
			}
			else merge(arr,1,1);
		}
	
}

void merge(int arr[],int left,int right)
{
	int vleft,vright;
	int i,j,k;i=j=k=0;
	int *p=(int *)malloc((left+right)*sizeof(int));
	while(i<left&&j<right)
	{
		if(arr[i]<arr[j+left])
			{
				*(p+k)=arr[i];
				i++;
				k++;
				
			}
		else {
			*(p+k)=arr[j+left];
			j++;k++;
		}
	}
	if(i==left)
		{
			while(j<right){
				*(p+k)=arr[j+left];
				j++;k++;
			}
		}
		if(j==right)
		{
			while(i<left){
				*(p+k)=arr[i];
				i++;k++;
			}
		}
	for(i=0;i<left+right;i++)arr[i]=*(p+i);
}

還是新手..遞歸體那裏還不夠簡練...敲代碼的時候,有一個括號括錯地方了,語法沒錯只是邏輯錯了..最討厭了.....debug了好久....鬱悶死了....

還有幾個排序,:希爾排序,堆排序,快速排序...之類的,以後再去寫吧...


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章