Bài tập sắp xếp thứ tự trong C

Mình đang có bài tập 5 này trong tài liệu căn bản C, các bạn giúp mình với :smiley:

Bạn có thể dùng các giải thuật sắp xếp đơn giản như sắp xếp bọt nổi, sắp xếp chọn, sắp xếp chèn để giải quyết bài toán trên.

3 Likes

=.= Mình không hiểu lắm các giải thuật bạn nói lắm :smiley: , mình mới học C và học đến bài này rồi " Tài liệu lập trình C for newbie - Chương 2: Những kỹ thuật nâng cao! " … Mình nghĩ bài tập 5 này sẽ giải theo hướng đơn giản vì giáo trình này cho bài tập những gì đã học :smiley:

Bạn có thể tham khảo các giải thuật kinh điển này.

int i,j,temp;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		if(a[i]>a[j])
		{
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}

ok mình đang tham khảo :smiley: cảm ơn 2 bạn giúp đỡ.
Nhưng có thể giúp mình hiểu sơ về temp theo cách nghĩ của bạn để mình hiểu thêm đc k :smiley: search google hơi khó hiểu

ở đây là mình so sánh và hoán đổi vị trí giữa hai biến a[i] và a[j]. temp sẽ đóng vai trò là một biến trung gian lưu trữ giá trị của a[i], sau đó a[i] sẽ được gán giá trị của biến a[j], và a[j] = temp, trước đó temp đã = a[i]

mình giải thích hơi khó hiểu. bạn thông cảm :3

Rất dễ hiểu mà, tks bạn <3

Mình có 3 đoạn code thể này các bạn giúp mình với!

    void sapxepArray(int array[], int kichthuoc);
    int main(int argc, char *argv[])
    {
        int array[]= {1,3,7,5,9};
        sapxepArray(array,5);
        return 0;
    }
    void sapxepArray(int array[], int kichthuoc)
    {
        int i = 0, j = 0, temp;
        for(i = 0; i < kichthuoc; i++)
        {
            for(j = i; j < kichthuoc; j++)
            {
                if(array[i] > array[j])
                {
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }
        for(i = 0; i<kichthuoc; i++)
        {
            printf("%d\n", array[i]);
        }
    }

Đoạn code thứ 2:

void sapxepArray(int array[], int kichthuoc);
int main(int argc, char *argv[])
{
    int array[]= {1,3,7,5,9};
    sapxepArray(array,5);
    return 0;
}
void sapxepArray(int array[], int kichthuoc)
{
    int i = 0, j = 0, temp;
    for(i = 0; i < kichthuoc - 1; i++)
    {
        for(j = i+1; j < kichthuoc; j++)
        {
            if(array[i] > array[j])
            {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    for(i = 0; i<kichthuoc; i++)
    {
        printf("%d\n", array[i]);
    }
}

Đoạn code thứ 3:

void sapxepArray(int array[], int kichthuoc);
int main(int argc, char *argv[])
{
    int array[]= {1,3,7,5,9};
    sapxepArray(array,5);
    return 0;
}
void sapxepArray(int array[], int kichthuoc)
{
    int i = 0, j = 0, temp;
    for(i = 0; i < kichthuoc; i++)
    {
        for(j = i+1; j < kichthuoc; j++)
        {
            if(array[i] > array[j])
            {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    for(i = 0; i<kichthuoc; i++)
    {
        printf("%d\n", array[i]);
    }
}

Mỗi đoạn code này khác nhau chổ vòng lập for, nhưng tất cả đều ra đúng kết quả như nhau. Các bạn giúp mình với nhé mình không hiểu vì sao lại như thế

Đây là các cách duyệt vòng tối ưu hơn cách mình đưa ra. vì các lần lặp ít hơn

Bạn có thể ib mình đễ nói rõ hơn nha, vì giải thích hơi dài dòng :3

1 Like

Trong đoạn code này mình sử dụng biến con trỏ và toán tử “New” để lấy kích thước của mảng mà không cần phải khai báo trước như theo yêu cầu đề bài, do hàm sắp xếp viết ở ngoài thân hàm main() nên yêu cầu phải khai báo theo kiêu con trỏ:

void sapxep(int *a, int kichThuoc)
{
	int i, j, temp;
	for(i = 0; i < kichThuoc; i++)
		for(j = 0; j < kichThuoc; j++)
		if(a[i] < a[j])
		{
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}
		
}

main()
{
	int *array;
	int size;
	cout << "Nhap kich thuoc: ";
	cin >> size;
	array = new int [size];

	for(int i = 0; i < size; i++)

	{
		cout << "phan tu thu " << i+1 << " " << "la: ";
		cin >> array[i];
	}
	sapxep(array, size);
	cout << "Thu tu sau khi sap xep la:" << endl;
	for(int i = 0; i < size; i++)
	{
		cout << array[i] << endl;
	}
	getch();
}

dạng bài của bạn mình chưa học tới :)) nhưng cũng xem tham khảo tks bạn nhé <3

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