11 thuật toán sắp xếp cơ bản trên mảng- Lập trình C++ cơ bản.
Hi all, "mình là lính mới" nhưng cũng mong được chia sẻ kiến thức của mình với những bạn được coi là "lính mới hơn". bắt đầu luôn nhé!
Việc sắp xếp dữ liệu là công việc "gặp thường xuyên" của các lập trình viên, có nhiều cách để sắp xếp dữ liệu thông qua các hàm trong thư viện chuẩn, nhưng theo mình thì lập trình viên không nên LƯỜI, hãy cứ code cho dù đó là thứ cơ bản, thứ mà bạn có thể search google một phát là ra. code nhiều sẽ giúp bạn nâng cao tư duy lập trình. Nhưng không phải ai cũng có đủ khả năng để nghĩ ra cách cài đặt thuật toán, vì vậy hôm nay mình xin chia sẻ với các bạn 11 thuật toán sắp xếp, nhưng ở đây chỉ là sắp xếp trên mảng, theo thứ tư tăng dần, hi vọng thông qua đây các bạn sẽ biết thêm những cách "Bá đạo" mà "cha ông" ta ngày xưa truyền lại để sắp xếp :)), ở đây mình chỉ share code thôi, việc tìm hiểu cách chạy của từng thuật toán các bạn tự tìm hiểu, cái này chắc trên lớp các bạn học hết rồi :)
Note: trong bài viết không có shaker sort vì mình nghĩ nó chẳng khác gì bubble sort, mà cài đặt lại dài ==>bỏ qua.
Việc sắp xếp dữ liệu là công việc "gặp thường xuyên" của các lập trình viên, có nhiều cách để sắp xếp dữ liệu thông qua các hàm trong thư viện chuẩn, nhưng theo mình thì lập trình viên không nên LƯỜI, hãy cứ code cho dù đó là thứ cơ bản, thứ mà bạn có thể search google một phát là ra. code nhiều sẽ giúp bạn nâng cao tư duy lập trình. Nhưng không phải ai cũng có đủ khả năng để nghĩ ra cách cài đặt thuật toán, vì vậy hôm nay mình xin chia sẻ với các bạn 11 thuật toán sắp xếp, nhưng ở đây chỉ là sắp xếp trên mảng, theo thứ tư tăng dần, hi vọng thông qua đây các bạn sẽ biết thêm những cách "Bá đạo" mà "cha ông" ta ngày xưa truyền lại để sắp xếp :)), ở đây mình chỉ share code thôi, việc tìm hiểu cách chạy của từng thuật toán các bạn tự tìm hiểu, cái này chắc trên lớp các bạn học hết rồi :)
Note: trong bài viết không có shaker sort vì mình nghĩ nó chẳng khác gì bubble sort, mà cài đặt lại dài ==>bỏ qua.
- //(1)InterchangeSort
- {
- int i, j;
- for (i = 0; i < n - 1; i++)
- {
- for (j = i+1; j < n; j++)
- {
- if (A[i]>A[j])
- {
- swap(A[i], A[j]);
- }
- }
- }
- }
- //(2)SelectionSort
- void SelectionSort(int *A, int n)
- {
- int j, i, Min;
- for (i = 0; i < n + 1; i++)
- {
- Min = i;
- for (j = i + 1; j < n; j++)
- {
- if (A[Min]>A[j])
- {
- Min= j;
- }
- }
- if (Min!=i)
- swap(A[i], A[Min]);
- }
- }
- //(3)BubbleSort
- void BubbleSort(int *A, int n)
- {
- int i, j;
- for (i = 0; i < n - 1; i++)
- {
- for (j = n - 1; j>i; j--)
- {
- if (A[j] < A[j - 1])
- {
- swap(A[j-1], A[j]);
- }
- }
- }
- }
- //(4)InsertionSort
- void InsertionSort(int *A, int n)
- {
- int i, pos;
- int x;
- for (i = 1; i < n; i++)
- {
- pos = i - 1, x = A[i];
- while ((A[pos]>x) && (pos >= 0))
- {
- A[pos + 1] = A[pos];
- pos--;
- }
- A[pos + 1] = x;
- }
- }
- //(5)BinaryInsertionSort
- void BinaryInsertionSort(int *A, int n)
- {
- int left, right, mid, i,j;
- int x;
- for (i = 1; i < n; i++)
- {
- left = 0, right = i - 1, x = A[i];
- while (left <= right)
- {
- mid = (left + right) / 2;
- if (A[mid] < x)
- {
- left = mid + 1;
- }
- else
- {
- right = mid - 1;
- }
- }
- for (j = i - 1; j >= left; j--)
- {
- A[j + 1] = A[j];
- }
- A[left] = x;
- }
- }
- //(6)QuickSort
- void QuickSort(int *A, int left, int right)
- {
- int i = left, j = right;
- int x = A[(left + right) / 2];
- while (i < j)
- {
- while (A[i] < x)i++;
- while (A[j]>x)j--;
- if (i <= j)
- {
- swap(A[i], A[j]);
- i++;
- j--;
- }
- }
- if (i < right)
- {
- QuickSort(A, i, right);
- }
- if (j>left)
- {
- QuickSort(A, left, j);
- }
- }
- //(7)ShellSort
- void ShellSort(int *A, int n)
- {
- //sap xep bang cach chia nua buoc nhay den khi bang 1
- int length, pos, i, x;
- for (length = n / 2; length > 0; length = length / 2)
- {
- for (i = length; i < n; i++)
- {
- pos = i - length, x = A[i];
- while ((pos >= 0) && (A[pos]>x))
- {
- A[pos + length] = A[pos];
- pos -= length;
- }
- A[pos + length] = x;
- }
- }
- }
- //(9)HeapSort
- void shift(int *&A, int left, int right)
- {
- int i = left;
- int j = 2 * i + 1;
- while(j <= right)
- {
- if ((j < right) && (A[j] < A[j + 1])) j++;
- if (A[i] < A[j])
- {
- swap(A[i], A[j]);
- i = j;
- j = i * 2 + 1;
- }
- else
- {
- return;
- }
- }
- }
- void createHeap(int *A, int n)
- {
- int i = n / 2 - 1;
- while (i >= 0)
- {
- shift(A, i, n - 1);
- i--;
- }
- }
- void HeapSort(int *A, int n)
- {
- createHeap(A, n);
- int r = n - 1;
- while (r)
- {
- swap(A[0], A[r]);
- r--;
- if (r>0)
- shift(A, 0, r);
- }
- }
- //10)Merge Sort
- void merge(int* array, int left, int mid, int right) {
- int *temp1=new int[mid - left + 1];
- int *temp2=new int[right - mid];
- int index_array = left;
- for (int i = 0; i < mid - left + 1; i++)
- temp1[i] = array[index_array++];
- for (int i = 0; i < right - mid; i++)
- temp2[i] = array[index_array++];
- int index_temp1 = 0, index_temp2 = 0;
- index_array = left;
- while (index_temp1 <= mid - left && index_temp2 < right - mid)
- {
- if (temp1[index_temp1] < temp2[index_temp2])
- {
- array[index_array] = temp1[index_temp1];
- index_temp1++;
- }
- else
- {
- array[index_array] = temp2[index_temp2];
- index_temp2++;
- }
- index_array++;
- }
- while (index_temp1 <= mid - left)
- {
- array[index_array] = temp1[index_temp1];
- index_array++;
- index_temp1++;
- }
- while (index_temp2 < right - mid)
- {
- array[index_array] = temp2[index_temp2];
- index_array++;
- index_temp2++;
- }
- }
- void Merge_sort(int* array, int left, int right) {
- int mid = (right + left) / 2;
- if (left < right) {
- Merge_sort(array, left, mid);
- Merge_sort(array, mid + 1, right);
- merge(array, left, mid, right);
- }
- }
- //11)Radix Sort
- void RadixSort(int *a, int n){
- int i;
- long long maxExp = 1;
- for (i = 0; i != n; i++){
- while (a[i] / maxExp != 0)
- maxExp *= 10;
- }
- long long exp = 1;
- int *tmpBuffer = new int[n];
- while (maxExp / exp != 0){
- int decimalBucket[10] = { 0 };
- for (i = 0; i != n; i++)
- decimalBucket[a[i] / exp % 10]++;
- for (i = 1; i != 10; i++)
- decimalBucket[i] += decimalBucket[i - 1];
- for (i = n - 1; i != -1; i--)
- tmpBuffer[--decimalBucket[a[i] / exp % 10]] = a[i];
- for (i = 0; i != n; i++)
- a[i] = tmpBuffer[i];
- exp *= 10;
- }
- }
Comments