Domain, hosting, vps giá rẻ
Kết quả 1 đến 4 của 4

Chủ đề: [C++] Các thuật toán sắp xếp cơ bản thường sử dụng

  1. #1
    nghiatichxanh1992's Avatar
    Bài viết
    5,038
    Cấp độ
    Bang hội
    Tiếu Ngạo
    Tu luyện
    Độ kiếp Hư Thần
    Giới tính
    Con trai
    Join Date
    Jun 2012
    Đến từ
    Hà Giang
    Tuổi
    31
    Danh vọng
    10
    Điện thoại
    0367790762

    [C++] Các thuật toán sắp xếp cơ bản thường sử dụng





    Thuật toán sắp xếp theo cơ số Radix Sort (Không hoạt động với mảng chứa số âm)

    Mã nguồn PHP:
    #include <iostream>


    using namespace std;


    int get_max_element(int arr[], int n) {
      
    int max arr[0];
      for (
    int i 1ni++)
        if (
    arr[i] > max)
          
    max arr[i];
      return 
    max;
    }

    void sort_counting(int arr[], int sizeint place) {
      
    int output[size 1];
      
    int max = (arr[0] / place) % 10;

      for (
    int i 1sizei++) {
        if (((
    arr[i] / place) % 10) > max)
          
    max arr[i];
      }
      
    int count[max 1];

      for (
    int i 0max; ++i)
        
    count[i] = 0;

      for (
    int i 0sizei++)
        
    count[(arr[i] / place) % 10]++;

      for (
    int i 110i++)
        
    count[i] += count[1];

      for (
    int i size 1>= 0i--) {
        
    output[count[(arr[i] / place) % 10] - 1] = arr[i];
        
    count[(arr[i] / place) % 10]--;
      }

      for (
    int i 0sizei++)
        
    arr[i] = output[i];
    }

    void sort_radix(int arr[], int size) {
      
    int max get_max_element(arrsize);
      for (
    int place 1max place 0place *= 10)
        
    sort_counting(arrsizeplace);
    }


    int main()
    {

        
    int arr[] {32,71,12,45,26,80,53,33,7,99,1,5,2,3,100};

        
    int n sizeof(arr) / sizeof(arr[0]); // so luong phan tu trong mang

        
    sort_radix(arrn);

        
    cout << "So luong phan tu trong mang: " << << endl;

        for (
    int i arr) {
            
    cout << << " ";
        }

        return 
    0;

    Lần sửa cuối bởi nghiatichxanh1992, ngày 23/09/2021 lúc 20:41.
    Diễn đàn chia sẻ kiến thức điện thoại: http://chiase123.com
    Click vào Hiện ra để xem chữ ký của mình

  2. #2
    nghiatichxanh1992's Avatar
    Bài viết
    5,038
    Cấp độ
    Bang hội
    Tiếu Ngạo
    Tu luyện
    Độ kiếp Hư Thần
    Giới tính
    Con trai
    Join Date
    Jun 2012
    Đến từ
    Hà Giang
    Tuổi
    31
    Danh vọng
    10
    Điện thoại
    0367790762
    Thuật toán sắp xếp nhanh Quick Sort


    Mã nguồn PHP:
    #include <iostream>


    using namespace std;


    void quickSort(int Data[], int l int r)
    {
        
    // If the first index less or equal than the last index
        
    if (<= r)
        {
            
    // Create a Key/Pivot Element
            
    int key Data[(l+r)/2];

            
    // Create temp Variables to loop through array
            
    int i l;
            
    int j r;

            while (
    <= j)
            {
                while (
    Data[i] < key)
                    
    i++;
                while (
    Data[j] > key)
                    
    j--;

                if (
    <= j)
                {
                    
    swap(Data[i], Data[j]);
                    
    i++;
                    
    j--;
                }
            }

            
    // Recursion to the smaller partition in the array after sorted above

            
    if (j)
                
    quickSort(Datalj);
            if (
    i)
                
    quickSort(Datair);
        }
    }


    int main()
    {

        
    int arr[] {32,71,12,45,26,80,53,33,-7,99,1,5,2,-3,-100};

        
    int n sizeof(arr) / sizeof(arr[0]); // so luong phan tu trong mang

        
    quickSort(arr0n-1);

        
    cout << "So luong phan tu trong mang: " << << endl;

        for (
    int i arr) {
            
    cout << << " ";
        }

        return 
    0;

    Lần sửa cuối bởi nghiatichxanh1992, ngày 11/09/2021 lúc 0:34.
    Diễn đàn chia sẻ kiến thức điện thoại: http://chiase123.com
    Click vào Hiện ra để xem chữ ký của mình

  3. #3
    nghiatichxanh1992's Avatar
    Bài viết
    5,038
    Cấp độ
    Bang hội
    Tiếu Ngạo
    Tu luyện
    Độ kiếp Hư Thần
    Giới tính
    Con trai
    Join Date
    Jun 2012
    Đến từ
    Hà Giang
    Tuổi
    31
    Danh vọng
    10
    Điện thoại
    0367790762
    Thuật toán Counting Sort – Thuật toán sắp xếp đếm phân phối (thuật toán tốt hơn Quick Sort, nhưng tốn bộ nhớ hơn)

    Mã nguồn PHP:
    #include <iostream>


    using namespace std;


    // Function that sort the given input
    void counting_sort(int input[], int n)
    {

        
    int output[n]; // The output will have sorted input array
        
    int max input[0];
        
    int min input[0];

        for(
    int i 1ni++)
        {
            if(
    input[i] > max)
                
    max input[i]; // Maximum value in array
            
    else if(input[i] < min)
                
    min input[i]; // Minimum value in array
        
    }

        
    int k max min 1// Size of count array

        
    int count_array[k]; // Create a count_array to store count of each individual input value
        
    fill_n(count_arrayk0); // Initialize count_array elements as zero

        
    for(int i 0ni++)
            
    count_array[input[i] - min]++; // Store count of each individual input value

        /* Change count_array so that count_array now contains actual
         position of input values in output array */
        
    for(int i 1ki++)
            
    count_array[i] += count_array[1];


        
    // Populate output array using count_array and input array
        
    for(int i 0ni++)
        {
            
    output[count_array[input[i] - min] - 1] = input[i];
            
    count_array[input[i] - min]--;
        }


        for(
    int i 0ni++)
            
    input[i] = output[i]; // Copy the output array to input, so that input now contains sorted values

    }


    int main()
    {

        
    int arr[] {32,71,12,45,26,80,53,33,-7,99,1,5,2,-3,-100};

        
    int n sizeof(arr) / sizeof(arr[0]); // so luong phan tu trong mang

        
    counting_sort(arrn);

        
    cout << "So luong phan tu trong mang: " << << endl;

        for (
    int i arr) {
            
    cout << << " ";
        }

        return 
    0;

    Lần sửa cuối bởi nghiatichxanh1992, ngày 11/09/2021 lúc 2:31.
    Diễn đàn chia sẻ kiến thức điện thoại: http://chiase123.com
    Click vào Hiện ra để xem chữ ký của mình

  4. #4
    nghiatichxanh1992's Avatar
    Bài viết
    5,038
    Cấp độ
    Bang hội
    Tiếu Ngạo
    Tu luyện
    Độ kiếp Hư Thần
    Giới tính
    Con trai
    Join Date
    Jun 2012
    Đến từ
    Hà Giang
    Tuổi
    31
    Danh vọng
    10
    Điện thoại
    0367790762
    Thuật toán sắp xếp trộn Merge Sort (nên ưu tiên dùng thuật toán Quick Sort hơn)


    Mã nguồn PHP:
    #include <iostream>


    using namespace std;


    // Gộp hai mảng con arr[l...m] và arr[m+1..r]
    void merge(int arr[], int lint mint r)
    {
        
    int ijk;
        
    int n1 1;
        
    int n2 =  m;

        
    /* Tạo các mảng tạm */
        
    int L[n1], R[n2];

        
    /* Copy dữ liệu sang các mảng tạm */
        
    for (0n1i++)
            
    L[i] = arr[i];
        for (
    0n2j++)
            
    R[j] = arr[1j];

        
    /* Gộp hai mảng tạm vừa rồi vào mảng arr*/
        
    0// Khởi tạo chỉ số bắt đầu của mảng con đầu tiên
        
    0// Khởi tạo chỉ số bắt đầu của mảng con thứ hai
        
    l// IKhởi tạo chỉ số bắt đầu của mảng lưu kết quả
        
    while (n1 && n2)
        {
            if (
    L[i] <= R[j])
            {
                
    arr[k] = L[i];
                
    i++;
            }
            else
            {
                
    arr[k] = R[j];
                
    j++;
            }
            
    k++;
        }

        
    /* Copy các phần tử còn lại của mảng L vào arr nếu có */
        
    while (n1)
        {
            
    arr[k] = L[i];
            
    i++;
            
    k++;
        }

        
    /* Copy các phần tử còn lại của mảng R vào arr nếu có */
        
    while (n2)
        {
            
    arr[k] = R[j];
            
    j++;
            
    k++;
        }
    }

    /* l là chỉ số trái và r là chỉ số phải của mảng cần được sắp xếp */
    void mergeSort(int arr[], int lint r)
    {
        if (
    r)
        {
            
    // Tương tự (l+r)/2, nhưng cách này tránh tràn số khi l và r lớn
            
    int m l+(r-l)/2;

            
    // Gọi hàm đệ quy tiếp tục chia đôi từng nửa mảng
            
    mergeSort(arrlm);
            
    mergeSort(arrm+1r);

            
    merge(arrlmr);
        }
    }


    int main()
    {

        
    int arr[] {32,71,12,45,26,80,53,33,-7,99,1,5,2,-3,-100};

        
    int n sizeof(arr) / sizeof(arr[0]); // so luong phan tu trong mang

        
    mergeSort(arr0n-1);

        
    cout << "So luong phan tu trong mang: " << << endl;

        for (
    int i arr) {
            
    cout << << " ";
        }

        return 
    0;

    Diễn đàn chia sẻ kiến thức điện thoại: http://chiase123.com
    Click vào Hiện ra để xem chữ ký của mình

Thông tin về chủ đề này

Users Browsing this Thread

Có 1 người đang xem chủ đề. (0 thành viên và 1 khách)

Các Chủ đề tương tự

  1. Trả lời: 0
    Bài viết cuối: 21/03/2013, 12:43

Tag của Chủ đề này

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •