Untitled
unknown
plain_text
3 years ago
3.4 kB
2
Indexable
#include<stdio.h> #include<stdbool.h> void selectionSort(int arr[], int n) { int i, j, min_idx,tmp; // Di chuyển ranh giới của mảng đã sắp xếp và chưa sắp xếp for (i = 0; i < n-1; i++) { // Tìm phần tử nhỏ nhất trong mảng chưa sắp xếp min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; // Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên tmp = arr[min_idx]; arr[min_idx] = arr[i]; arr[i] = tmp; } } void insertionSort(int arr[], int n) { int i, key, j; for (i = 1; i < n; i++) { key = arr[i]; j = i-1; /* Di chuyển các phần tử có giá trị lớn hơn giá trị key về sau một vị trí so với vị trí ban đầu của nó */ while (j >= 0 && arr[j] > key) { arr[j+1] = arr[j]; j = j-1; } arr[j+1] = key; } } void bubbleSort(int arr[], int n) { int i, j, tmp; bool haveSwap = false; for (i = 0; i < n-1; i++){ // i phần tử cuối cùng đã được sắp xếp haveSwap = false; for (j = 0; j < n-i-1; j++){ if (arr[j] > arr[j+1]){ tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; haveSwap = true; // Kiểm tra lần lặp này có swap không } } // Nếu không có swap nào được thực hiện => mảng đã sắp xếp. Không cần lặp thêm if(haveSwap == false){ break; } } } int partition (int arr[], int low, int high) { int tmp; int pivot = arr[high]; // pivot int left = low; int right = high - 1; while(true){ while(left <= right && arr[left] < pivot) left++; // Tìm phần tử >= arr[pivot] while(right >= left && arr[right] > pivot) right--; // Tìm phần tử <= arr[pivot] if (left >= right) break; // Đã duyệt xong thì thoát vòng lặp tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; // Nếu chưa xong, đổi chỗ. left++; // Vì left hiện tại đã xét, nên cần tăng right--; // Vì right hiện tại đã xét, nên cần giảm } tmp = arr[left]; arr[left] = arr[high]; arr[high] = tmp; return left; // Trả về chỉ số sẽ dùng để chia đổi mảng } void quickSort(int arr[], int low, int high) { if (low < high) { /* pi là chỉ số nơi phần tử này đã đứng đúng vị trí và là phần tử chia mảng làm 2 mảng con trái & phải */ int pi = partition(arr, low, high); // Gọi đệ quy sắp xếp 2 mảng con trái và phải quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } /* Hàm xuất mảng */ void printArray(int arr[], int size) { int i; for (i=0; i < size; i++) printf("%d ", arr[i]); } int main() { int n,i; scanf("%d",&n); int arr[n]; for(i = 0; i< n;i++){ scanf("%d",&arr[i]); } quickSort(arr, 0, n-1); printArray(arr, n); return 0; }
Editor is loading...