데이터 구조 - 8 대 정렬 알고리즘 c 언어 구현

67343 단어 데이터 구조
데이터 구조 - 8 대 정렬 알고리즘 c 언어 구현
삽입, 힐, 선택, 거품, 쌓 기, 빠 른 배열, 병합, 계수 c 언어 실현, 그리고 그 시간, 공간 복잡 도와 안정성 분석
#include
#include
#include"Sort.h" 
#include

void Swap(int* array, int i, int j){
     
	int tmp=array[i];
	array[i]=array[j];
	array[j]=tmp;
}
//    
//      :  O(n^2)   O(n)   O(n^2) 
//     :O(1)
//   :   
void insertSort(int* array, int n){
     
	int i;
	for(i=0;i<n-1;i++){
     
		int end=i;
		int key=array[end+1];
		while(end>=0&&array[end]>key){
     
			array[end+1]=array[end];
			end--;
		}
		array[end+1]=key;
	}
}
//    
//      :  O(n^1.3)   O(n)   O(n^1.3) 
//     :O(1)
//   :    
void shellSort(int* array, int n){
     
	int i,step=n/2;
	while(step>=1){
     
		for(i=0;i<n-step;i++){
     
		int end=i;
		int key=array[end+step];
		while(end>=0&&array[end]>key){
     
			array[end+step]=array[end];
			end-=step;
		}
		array[end+step]=key;
		}
		step/=2;
	}
	
}
//    
//      :  O(n^2)   O(n^2)   O(n^2) 
//     :O(1)
//   :   
void selectSort(int* array, int n){
     
	int i,j;
	for(i=0;i<n-1;i++){
     
		int min=i;
		for(j=i+1;j<n;j++){
     
			if(array[j]<array[min])
				min=j;
		}
		if(min!=i)
			Swap(array,min,i);			
	}
}

void selectSort2(int* array, int n){
     //   
	int begin=0,end=n-1;
	int i;
	while(begin<end){
     
		int min=begin,max=begin;
		for(i=begin;i<=end;i++){
     
			if(array[i]<array[min])
				min=i;
			if(array[i]>array[max])
				max=i;
		}
		Swap(array,begin,min);
		if(begin==max)
			max=min;
		Swap(array,end,max);
		begin++;
		end--;
	} 
} 
//    
//      :  O(n^2)   O(n)   O(n^2) 
//     :O(1)
//   :   
void bubbleSort(int* array, int n){
     
	int i,j;
	int flag=1; 
	for( i=0;i<n-1;i++){
     
		for(j=0;j<n-1-i;j++){
     
			if(array[j]>array[j+1])
				Swap(array,j+1,j);
				flag=0;
		}
		if(flag)
			break;
	}
}
//   
//      :O(nlgn) 
//     :O(1)
//   :    
void shiftDown(int* array, int n, int parent){
     
	int child=2*parent+1;
	while(child<n){
     
		if(child+1<n&&array[child+1]>array[child])
			child++;
		if(array[child]>array[parent]){
     
			Swap(array,child,parent);
			parent=child;
			child=2*parent+1;
		}else
			break;
	}
} 
void heapSort(int* array, int n){
     
	int i;
	for( i=(n-2)/2;i>=0;i--){
     
		shiftDown(array,n,i);
	}
	int size=n;
	for(i=0;i<n;i++){
     
		
		Swap(array,0,size-1);
		size--;
		shiftDown(array,size,0);
		
	}
}
//    
//      :  O(n^2)--          O(nlgn)   O(nlgn) 
//     :O(lgn)          O(n)     
//   :    

int getMid(int* array,int begin,int end){
     
	int mid=begin+(end-begin)/2;
	//begin,end,mid       
	if(array[begin]<array[mid]){
     
		if(array[mid]<array[end])
			return mid;
		else{
     //begin
			if(array[begin]>array[end])
				return begin;
			else
				return end;
		}
	} else{
     //begin>=mid
		if(array[mid]>array[end])
			return mid;
		else{
     //begin>=mid end>=mid
			if(array[begin]<array[end] )
				return begin;
			else
				return end;
		}
	}
} 
int partion(int* array, int begin, int end){
     //    
	int mid=getMid(array,begin,end);
	Swap(array,mid,begin);//  ,         
	int key=array[begin];
	while(begin<end){
     
		while(begin<end&&array[end]>=key)
			end--;
		array[begin]=array[end];
		while(begin<end&&array[begin]<=key)
			begin++;
		array[end]=array[begin];
	}
	array[begin]=key;
	return begin;
}
int partion2(int* array, int begin, int end){
     //hora
	int key=array[begin];
	int start=begin;
	while(begin<end){
     
		while(begin<end&&array[end]>=key)
			end--;
		while(begin<end&&array[begin]<=key)
			begin++;
		Swap(array,begin,end);
	}
	Swap(array,begin,start);
	return begin;
}
int partion3(int* array, int begin, int end){
     //      
	 int prev=begin;//             
	 int cur=prev+1;//                
	 int key=array[begin];
	 while(cur<=end){
     
	 	if(array[cur]<key&&++prev!=cur)
	 		Swap(array,cur,prev);
	 	cur++;
	 } 
	 Swap(array,begin,prev);
	 return prev;
}
void quickSort(int* array, int begin, int end){
     
	if(begin>=end)
		return;
	int keyPos=partion(array,begin,end);
	quickSort(array,begin,keyPos-1);
	quickSort(array,keyPos+1,end);
}
//       
void quickSortNoR(int* array,int n){
     
	Stack st;
	stackInit(&st,10);
	if(n>1){
     
		stackPush(&st,n-1);
		stackPush(&st,0);
	}
	while(stackEmpty(&st)!=1){
     
		int begin=stackTop(&st);
		stackPop(&st);
		int end=stackTop(&st);
		stackPop(&st);
		//  
		int keyPos=partion(array,begin,end);
		//     :   
		//   :keyPos+1--end
		if(keyPos+1<end){
     
			stackPush(&st,end);
			stackPush(&st,keyPos+1);
		} 
		//   :begin--keyPos 
		if(begin<keyPos-1){
     
			stackPush(&st,keyPos-1);
			stackPush(&st,begin);
		}
	}
	
}
//         
void quickSortNoR2(int* array,int n){
     
	Queue q;
	queueInit(&q);
	if(n>1){
     
		queuePush(&q,0);
		queuePush(&q,n-1);
	}
	while(queueEmpty(&q)!=1){
     
		int begin=queueFront(&q);
		queuePop(&q);
		int end=queueFront(&q);
		queuePop(&q);
		//  
		int keyPos=partion(array,begin,end);
		//       ,      
		//     begin--keyPos-1
		if(begin<keyPos-1){
     
			queuePush(&q,begin);
			queuePush(&q,keyPos-1);
		} 
		//    keyPos+1--end
		if(keyPos+1<end){
     
			queuePush(&q,keyPos+1);
			queuePush(&q,end);
		} 
	}
} 
//    
//      :O(nlgn) 
//     :O(n)
//   :   
//          :begin--mid  mid+1--end 
void merge(int*array,int* tmp,int begin,int mid,int end){
     
	int idx=0,i;
	int begin1=begin,end1=mid,begin2=mid+1,end2=end;
	while(begin1<=end1&&begin2<=end2){
     
		if(array[begin1]<array[begin2])
			tmp[idx++]=array[begin1++];
		else
			tmp[idx++]=array[begin2++];
	} 
	while(begin1<=end1)
		tmp[idx++]=array[begin1++];
	while(begin2<=end2)
		tmp[idx++]=array[begin2++];
	for(i=0;i<idx;i++){
     //            
		array[i+begin]=tmp[i];
	}
}
void mergeSortR(int* array,int* tmp,int begin,int end){
     
	if(begin<end){
     
		int mid=begin+(end-begin)/2; 
		//            
		mergeSortR(array,tmp,begin,mid);
		mergeSortR(array,tmp,mid+1,end);
		merge(array,tmp,begin,mid,end); 
	}
} 
void mergeSort(int* array,int n){
     
	if(n>1){
     
		int* tmp=(int*)malloc(sizeof(int)*n);
		mergeSortR(array,tmp,0,n-1);
		free(tmp); 
	}
}
//      
void mergeSortNoR(int* array,int n){
     
	if(n<=1)
		return;
	int* tmp=(int*)malloc(sizeof(int)*n);
	int k=1,i;
	while(k<n){
     
		//     
		for(i=0;i<n;i+=2*k){
     
			int begin=i;
			int mid=i+k-1;
			if(mid>=n-1)
				continue;
			int end=i+2*k-1;
			if(end>=n)
				end=n-1;
			merge(array,tmp,begin,mid,end);
		} 
		k*=2;
	} 
}
//    
//      :O(max(n,range)) 
//     :O(range)
//   :           
void countSort(int* array,int n){
     
	//    
	int i;
	int min=array[0],max=array[0];
	for(i=1;i<n;i++){
     
		if(array[i]<min)
			min=array[i];
		if(array[i]>max)
			max=array[i];
	} 
	int range=max-min+1;
	int* countArr=(int*)malloc(sizeof(int)*range);
	memset(countArr,0,sizeof(int)*range);
	for(i=0;i<n;i++){
     
		countArr[array[i]-min]++;
	} 
	int idx=0;
	for(i=0;i<range;i++){
     
		while(countArr[i]--){
     
			array[idx++]=i+min;
		}
	}
	free(countArr);
}

좋은 웹페이지 즐겨찾기