常用排序算法复习

排序

O(n2):选择排序、插入排序、冒泡排序

  • 选择排序:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
  • 直接插入排序:将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
  • 冒泡排序:两个数比较大小,较大的数下沉,较小的数冒起来。
//选择排序
void selection_sort(int arr[],int len){
	for(int i=0;i<len;i++){
		int min=i;
		for(int j=i+1;j<len;j++){
			if(arr[j]<arr[min]){
				min=j;
			}
		}
		swap(arr[min],arr[i]);
	}
} 
//冒泡排序
void bubble_sort(int arr[],int len){
	for(int i=0;i<len-1;i++)
	for(int j=0;j<len-1-i;j++)
	if(arr[j]>arr[j+1])
	swap(arr[j],arr[j+1]);
}
//插入排序
void insertion_sort(int arr[],int len){
	for(int i=1;i<len;i++){
		int key=arr[i];
		int j=i-1;
		while(j>=0&&key<arr[j]){
			arr[j+1]=arr[j];
			j--;
		}
		arr[j+1]=key;
	}
}

O(nlog n):归并排序、快速排序

  • 归并排序:把待排序的序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序的序列。
  • 快速排序:从数列中挑出一个元素,称为 “基准”(pivot);然后重新排序数列,所有比基准值小的元素放置在基准前面,所有比基准值大的元素放置在基准的后面,和基准相同的元素则可以放置在任何一边。在这个分区结束之后,该基准就处于序列中的某一位置。这一操作称为分区(partition)操作。然后,递归地把小于基准值元素的子序列和大于基准值元素的子序列进行排序
//归并排序
void Merge(int r[],int temp[],int s,int m,int t){
	int i=s;
	int j=m+1;
	int k=i;
	while(i<=m&&j<=t){
		if(r[i]<=r[j])
		temp[k++]=r[i++];
		else
		temp[k++]=r[j++];
	}
	while(i<=m)
	temp[k++]=r[i++];
	while(j<=t)
	temp[k++]=r[j++];
	for(i=s;i<=t;i++)
	r[i]=temp[i];
}
void MergeSort(int r[],int temp[],int s,int t){
	if(s==t)
	return;
	else{
		int m=(s+t)/2;
		MergeSort(r,temp,s,m);
		MergeSort(r,temp,m+1,t);
		Merge(r,temp,s,m,t);
	}
}

//快速排序
int Paritition(int A[],int low,int high){
	int pivot=A[low];
	while(low<high){
	while(low<high&&A[high]>=pivot)
		--high;
	A[low]=A[high];
	while(low<high&&A[low]<=pivot)
		++low;
	A[high]=A[low];
}
A[low]=pivot;
return low;
}
void QUickSort(int A[],int low,int high){
	if(low<high){
		int pivot=Paritition(A,low,high);
		QuickSort(A,low,pivot-1);
		QucikSort(A,pivot+1,high);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值