数据结构——八大排序算法c语言实现

数据结构——八大排序算法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);
}

你可能感兴趣的:(数据结构,数据结构)