排序(2021.7.22)

本文详细介绍了多种排序算法,包括冒泡排序、快速排序及其优化,以及选择排序和插入排序在链表上的实现。此外,还涉及了数组元素定位、小根堆判断和两有序表的合并。这些算法在实际编程中有着广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考研 ing
努力努力再努力
**
1.双向冒泡

void bubble(ElemType A[],int n){
	int low=0,high=n-1;
	bool flag=true;
	while(low<high&&flag){
		flag=false;
		for(i=low;i<high;i++){
			if(A[i]>A[i+1])
				swap;
			flag=true;
		}
		high--;
		for(i=high;i>low;i--){
			if(A{i]<A[i-1])
				swap;
			flag=true;
		}
		low++;
	}
}

2.奇数偶数各一边

void move(ElemType A[],int len){
	int i=0,j=len-1;
	while(i<j){
		while(i<j&&A[i]%2!=0)	i++;
		while(i<j&&A[j}%2==0)	j--;
		if(i<j)
		swap(A[i],A[j]);
		i++,j--;
	}
}

3.快速排序(新编)

int partition(ElemType A[],int low,int high){
	int rad=low+rand()%(high-low+1);
	swap(A[rad],A[low]);
	pivot=A[low];
	int i=low;
	for(j=low+1;j<=high;j++)
		if(A[j]<pivot)
			swap(A[++i],A[j]);
	swap(A[i],A[low]);
	return i;
}

4.找出数组中第k小的元素

int k_min(ElemType A[],int low,int high,int k){
	int pivot=A[low];
	int low_temp=low;
	int high_temp=high;
	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;
	if(low==k)
		return A[low};
	else	if(low>k)
		return k_min(A,low_temp,low-1,k);
	else
		return k_min(A,low+1,high_temp,k);
}

5.寻找个数差最小且和差最大

int setpartition(int A[],int n){
	int low=low0=0,high=high0=n-1;
	int flag=1,k=n/2;
	int s1=s2=0;
	pivot=A[low];
	while(flag){
	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];
	}
	if(low==k-1)
		flag=0;
	else	if(low>k-1)
		high=high--,low=low0;
	else	
		low=low++,high=high0;
	}
	for(i=0;i<k;i++)
		s1+=A[i];
	for(i=k;i<n;i++)
		s2+=A[i];
	return s2-s1;
}

6.荷兰国旗

typedef enum{red,white,blue}	color;
void flag_arrange(color A[],int n){
	int i=j=0,k=n-1;
	while(j<k){
		switch(A[j]){
			case	red:swap(A[i],A[j]),i++,j++;break;
			case	white:j++;break;
			case	blue:swap(A[j],A[k]),k--;break;
		}
	}
}

7.单链表实现简单选择排序

void selectsort(LinkList &L){
	LinkNode *h=L,*p,*q,*r,*s;
	L=NULL;
	while(h!=NULL){
		p=s=h,q=r=NULL;
		while(p){
			if(p->data>s->data)
				s=p,r=q;
				q=p
				p=p->next;
		}
		if(s==h)
			h=h->next;
		else
			r->next=s->next;
		s->next=L,L=s;
	}
}

8.判断是否为小根堆

bool isminheap(ElemType A[],int len){
	if(n%2==0){
		if(A[len/2]>A[len])	
			return flase;
		for(i=len/2-1;i>=1;i--)
			if(A[i]>A{2*i]||A[i]>A[2*i+1])
				return false;
	}
	else{
		for(i=len/2;i>=1;i--)
			if(A[i]>A{2*i]||A[i]>A[2*i+1])
				return false;
	}
	return true;
}

9.直接插入排序实现两有序表合并

void insert_sort(ElemType A[],int m,int n){
	for(i=m+1;i<=n+m;i++){
		A[0]=A[i];
		for(j=i-1;A{j]>A[0];j--)
			A[j+1]=A[j];
		A[j+1]=A[0];
	}
}

10.记数排序

1st:每次都选取一个记录跟所有记录比较。
void countsort(ElemType A[],RecType B[],int n){
	for(i=0;i<n;i++){
		count=0;
		for(j=0;j<n;i++)
			if(A[i].key>A[j].key)
				count++;
		B[count]=A[i];
	}
}

2st:任意两个元素只能比较一次。
//思想:增加count域,越小元素count越小
part:	for(i=0;i<n;i++)
			A[i].count=0;
		for(i=0;i<n;i++)
			for(j=i+1;j<n;j++)
				if(A[i].key>A[j].key)
					A[i].count++;
				else
					A[j].count++;

11.数组元素到合适位置

int partition(ElemType K[],int n){
	int i=1,j=n;
	ElemType pivot=K[j];
	while(i<j){
		while(i<j&&K[i]<=pivot)
			i++;
		if(i<j)
			K[j]=K[i];
		while(i<j&&K[j]>pivot)
			j--;
		if(i<j)
			K[i]=K[j];
	}
	K[i]=pivot;
	return i;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值