Sắp xếp các số dương trong mảng số nguyên tăng dần, các số âm vẫn giữ nguyên vị trí và giá trị

Chào các bác.
Em đang code trên C, đề bài như thế này sắp xếp các số dương trong mảng số nguyên tăng dần,các số âm vẫn giữ nguyên vị trí và giá tri. (em làm được interchange sort và selection sort nhưng bubble sort với insert sort không làm ra được)

vd: 6 -7 -8 3 -10 9
sorted: 3 -7 -8 6 -10 9
em mò hoài mà chẳng ra chịu ,google các kiểu mà không thấy.Em sửa lại cái điều kiện trong if mà hình như sai rồi.

#include <stdio.h>
#include <conio.h>
#define MAX 100
#include <stdlib.h>
#include <time.h>
void nhapmag(int a[],int n);
void xuatmag(int a[],int n);
void nhaprand(int a[],int n);
void nhapsl(int &sl);
void hoanvi(int &a,int &b);
int random(int min,int max);
//---------sap xep---------------------
void bubblesort(int a[],int n);
void interchange(int a[],int n);
void selection(int a[],int n);
void insert(int a[],int n);
//----------------------------------
int main()
{
	int a[MAX];
	int x;
	int sl;
	do{
		printf("\nnhap lua chon(0-de thoat)!!!");
		printf("\n1:nhap xuat mag!!!");
		printf("\n2:nhap random!!");
		printf("\n3:bubblesort !!!! ");
		printf("\n4:interchange sort!!! ");
		printf("\n5:selection sort!!! ");
		printf("\n6:insertsort !!!!");
		scanf("%d",&x);
		switch(x)
		{
			case 1:
				nhapsl(sl);
				nhapmag(a,sl);
				xuatmag(a,sl);
			break;
			
			case 2:
				nhapsl(sl);
				nhaprand(a,sl);
				xuatmag(a,sl);
			break;

			case 3:
				bubblesort(a,sl);
				xuatmag(a,sl);
			break;
			
			case 4:
				interchange(a,sl);
				xuatmag(a,sl);
			break;
			
			case 5:
				selection(a,sl);
				xuatmag(a,sl);
			break;
			
			case 6:
				insert(a,sl);
				xuatmag(a,sl);
			break;
		}
	}while(x!=0);
}
//------------nhap xuat mang-------------
void nhapmag(int a[],int n)
{
	for(int i=0;i<n;i++)
	{
		printf("\na[%d]= ",i);
		scanf("%d",&a[i]);
	}
}
void nhaprand(int a[],int n)
{
	srand((int)time(0));
	for(int i=0;i<n;i++)
	{
		a[i]=random(-100,100);
	}
}
void xuatmag(int a[],int n)
{
	
	for(int i=0;i<n;i++)
	{
		printf("%5d",a[i]);
	}
}

void nhapsl(int &sl)
{
	do{
		printf("\nnhap so luong : ");
		scanf("%d",&sl);
		if(sl<0||sl>100)
			printf("\n nhap so luong <100 hoac >0!!!");
	}while(sl<0||sl>100);
}
//----------ham phu-------------
void hoanvi(int &a,int &b)
{
	int tam=a;
	a=b;
	b=tam;
		
}

int random(int min,int max)
{
	return min+rand()%(max+1-min);
}
//----------bubble sort
void bubblesort(int a[],int n)
{
	for(int i=0;i<n-1;i++)
	{
		for(int j=n-1;j>i;j--)
		{
			if((a[j]<a[j-1] && a[j]>0 && a[j-1]>0) || (a[j]<0 && a[j-1]<0))
				hoanvi(a[j],a[j-1]);
		}
	}
}

//---------interchange
void interchange(int a[],int n)
{
	int i,j;
	for(i=0;i<n-1;i++)
	{
		if(a[i]>0)
		{	
			for(j=i+1;j<n;j++)
				if(a[j]>0 && a[i]>a[j])
					hoanvi(a[i],a[j]);
		}
	}
}

////---------selection
void selection(int a[],int n)
{
	int vtmin;
	for(int i=0;i<n-1;i++)
	{
		if(a[i]>0)
		{
			vtmin=i;
			for(int j=i+1;j<n;j++)
				if(a[j]<a[vtmin] && a[j]>0)
					vtmin=j;
			hoanvi(a[vtmin],a[i]);
		}	
	}
}
////----------insertsort
void insert(int a[],int n)
{
	int vt,x,i;
	for(i=1;i<n;i++)
	{
		if(a[i]>a[i+1])
		{
			vt=i-1;
			x=a[i];
			while(vt>=0 && a[vt]>x)
			{
				a[vt+1]=a[vt];
				vt--;		
			}
			a[vt+1]=x;
		}
	}
}

Interchange với Selection là một :smiley:

Sửa lại Bubble dễ mà :slight_smile: bubble là tráo đổi hai phần tử kế nhau. Insertion xin dành cho bạn đọc :slight_smile:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?