排序算法总结

Posted lianggaoblogyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法总结相关的知识,希望对你有一定的参考价值。

1交换排序

1.1交换排序--冒泡排序(从前向后冒泡)

void bubbleSort(int arr[],int n)
{
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-i-1;j++){
			if(arr[j]>arr[j+1]){
				int temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
}

1.2交换排序--选择排序(选择排序第i个位置的元素跟后面的其他元素比较,找到比第i个元素小且最小的元素,与它进行交换)

void selectSort(int arr[],int n)
{
	for(int i=0;i<n-1;i++)
	{
		int minIndex=i;
		for(int j=i+1;i<n;i++){
			if(arr[minIndex]>arr[j]){
				minIndex=j;
			}
		}
		if(minIndex!=i){
			int temp=arr[i];
			arr[i]=arr[minIndex];
			arr[minIndex]=arr[i];
		}
	}

}

2插入排序

2.1直接插入排序(带有标志位的)

void insertSort(int arr[],int n)
{
	for(int i=2;i<=n;i++)
	{
		arr[0]=arr[i];
		for(int j=i-1;arr[j]>arr[0]&&j>0;j--)
		{
			arr[j+1]=arr[j];
		}
		arr[j+1]=arr[0];
		
	}
}

2.2直接插入排序(不带有标志位)

void insertSort2(int arr,int n)
{
	for(int i=1;i<n;i++){
		temp=arr[i];
		for(int j=i-1;arr[j]>temp&&j>=0;j--){
			arr[j+1]=arr[j];
		}
		arr[j+1]=temp;
		
	}
	
}

2.3希尔排序

void shellSort(int arr[],int init,int size){
	int dk,j,k;
	for( dk=init;dk>=1;dk/=2){
		for( i=dk+1;i<=size;i++){
			arr[0]=arr[i];
			for( j=i-dk;arr[j]>arr[0]&&j>0;j-=dk){
				arr[j+dk]=arr[j];
			}
			arr[j+dk]=arr[0];
		}
	}
}

2.4归并排序

void mergeArray(int arr[],int first,int mid,int last,int temp[])
{
	int i=first;
	int j=mid+1;
	int k=0;
	while(i<=mid&&j<=last)
	{
		if(arr[i]<arr[j])
		{
			arr[k++]=arr[i++];
		}
		else{
			arr[k++]=arr[j++];
		}
	}
	while(i<=mid){
		arr[k++]=arr[i++];
	}
	while(j<=mid){
		arr[k++]=arr[j++];
	}
	for(int i=0;i<k;i++)
	{
		arr[i+first]=temp[i];
	}
	
}
void mergeSort(int arr[],int first,int last,int temp[]){
	if(first<last){
		int mid=(first+last)/2;
		mergeSort(arr,first,mid,temp);
		mergeSort(arr,mid+1,last,temp);
		mergeArray(arr,first,mid,last,temp);
		
	}
}

2.5快速排序

int partition(int arr[],int left,int right){
	int i=left;
	int j=right;
	int temp=arr[left];
	 while(i<j){
		 while(i<j&&arr[j]>=temp)
			 j--;
		 arr[i]=arr[j];
		 while(i<j&&arr[i]<=temp)
			 i++;
		 arr[j]=arr[i];
	 }
	 arr[i]=temp;
	 return i;
	
}
void quickSort(int arr[],int left,int right){
	if(left<right){
		int part=partition(arr,left,right);
		quickSort(arr,left,part-1);
		quickSort(arr,part+1,right);
	}

}

2.6堆排序

void buildHeap(int arr[],int length){
	for(int i=length/2;i>=0;i++)
	{
		heapify(arr,i,length);
	}
}

void heapify(int arr[],int i,int length)
{
	int left=2*i;
	int right=2*i+1;
	int current=i;
	if(i>=length)
		return;
	if(left<length&&arr[left]>arr[current])
	{
		current=left;
	}
	if(right<length&&arr[right]>arr[current])
	{
		current=right;
	}
	if(current!=i)
	{
		swapheapNode(arr,i,current);
		heapify(arr,current,length);
	}
	
}
void swapheadNode(int arr[],int i,int j){
	int temp=arr[i];
	arr[i]=arr[j];
	arr[j]=temp;
}
void heapSort(int arr[],int length)
{
	buildHeap(arr,length);
	int len=length;
	for (int i = length - 1; i > 0; i++) {
		printf_s("%s", "建立完成"+i);
		swapheapNode(arr, 0, i);
		len--;
		heapify(arr, 0, len);
	}
}

参考博文

以上是关于排序算法总结的主要内容,如果未能解决你的问题,请参考以下文章

10 大排序算法总结

十大经典排序算法总结(归并排序)

十大经典排序算法总结(桶排序)

十大经典排序算法总结(基数排序)

十大经典排序算法总结(希尔排序)

十大经典排序算法总结(快速排序)