01/10/2018, 01:09

Hỏi về quicksort

Theo mình biết thì tư tưởng của quicksort là:

  1. Tìm chốt
  2. Chuyển tất cả giá trị < chốt về bên trái
  3. Chuyển tất cả giá trị > chốt về bên phải
  4. quicksort mảng con trái
  5. quicksort mảng con phải
    Theo code quicksort dưới (đúng) thì sau mỗi lần đệ quy lại đệ quy (left,j) (i,right), như vậy đã không tuân theo tư tưởng của quicksort. Tức là nếu đúng là phải đệ quy (left, m-1) (m+1, right), mình cứ thắc mắc mãi cái này.
#include <iostream>
using namespace std;

void print(int *a, int n)
{
    int i=0;
    while(i<n){
        cout<<a[i]<<",";
        i++;
    }
}

void swap(int i,int j, int *a){
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}


void quicksort(int *arr, int left, int right){
    int min = (left+right)/2;
    cout<<"QS:"<<left<<","<<right<<"
";

    int i = left;
    int j = right;
    int pivot = arr[min];

    while(left<j || i<right)
    {
        while(arr[i]<pivot)
        i++;
        while(arr[j]>pivot)
        j--;

        if(i<=j){
            swap(i,j,arr);
            i++;
            j--;
        }
        else{
            if(left<j)
                quicksort(arr, left, j);
            if(i<right)
                quicksort(arr,i,right);
            return;
        }
    }
}


int main() {
    int arr[8] = {110, 5, 10,3 ,22, 100, 1, 23};
    quicksort(arr, 0, (sizeof(arr)/sizeof(arr[0]))-1);
    print(arr, (sizeof(arr)/sizeof(arr[0])));
    return 0;
}
Nguyễn Xuân Phúc viết 03:16 ngày 01/10/2018

cái vấn đề nó nằm ở thế nào là “mảng con trái” và “mảng con phải”, thì thấy là sau khi swap hết các cặp, thì có đảm bảo các phần tử từ left đến j sẽ không lớn hơn các phần tử từ i đến right, vậy thì mảng con trái và mảng con chính là tụi nó rồi

Minh Hoàng viết 03:12 ngày 01/10/2018

m là gì? trong tư tưởng với code đâu có thấy m. :)) làm rõ m là hiểu thôi

Dũng viết 03:13 ngày 01/10/2018

thì m là vị trí của pivot (chốt) ý bạn!

Dũng viết 03:14 ngày 01/10/2018

Vậy chốt sau khi thực hiện sẽ không nằm ở khoảng giữa 2 mảng con đó sao? Nó tụt về mảng con trái

Minh Hoàng viết 03:18 ngày 01/10/2018

Vậy 2 tập chia ra theo vị trí chốt hay giá trị của chốt?

Dũng viết 03:18 ngày 01/10/2018

À mình hiểu rồi. Trước đây mình nghĩ là chia thành 2 mảng con và chốt phải nằm giữa 2 mảng đó =))

Bài liên quan
0