- #include <stdio.h>
- void swap(int *a, int *b);
- void bubble_sort(int a[], int n);
- void select_sort(int a[], int n);
- void insert_sort(int a[], int n);
- void shell_sort(int a[], int n);
- void heap_adjust(int a[], int i, int n);
- void heap_sort(int a[], int n);
- void quick_sort(int a[], int low, int high);
- int main()
- {
- // int arr[] = {0,2,3,1,6,9,8,7,4,5};
- int arr[1000];
- int n,m;
- printf("请输入你排序的数字个数:\n");
- scanf("%d",&n);
- printf("请输入你排序的%d个数字:\n",n);
- for(int i=0;i<n;i++)
- scanf("%d",&arr[i]);
- printf("请输入你所使用的排序方法(数字):\n1 冒泡排序\n2 选择排序\n3 插入排序\n4 希尔排序\n5 堆排序\n6 快速排序\n");
- scanf("%d",&m);
- switch(m){
- case 1:
- bubble_sort(arr, n);
- break;
- case 2:
- select_sort(arr, n);
- break;
- case 3:
- insert_sort(arr, n);
- break;
- case 4:
- shell_sort(arr, n);
- break;
- case 5:
- heap_sort(arr, n);
- break;
- case 6:
- quick_sort(arr, 0, n-1);
- break;
- }
- for (int i = 0; i < n; i++)
- {
- printf("%d\n", arr[i]);
- }
- return 0;
- }
- //交換數據
- void swap(int *a, int *b)
- {
- int tmp = *a;
- *a = *b;
- *b = tmp;
- }
- //冒泡排序法
- //時間複雜度O(n^2) 空間複雜度O(1)
- void bubble_sort(int a[], int n)
- {
- int i, j;
- //旗幟位,判斷這次遍歷是否有交換
- int flag = 1;
- for (i = 0; i < n && flag; i++)
- {
- flag = 0;
- for (j = n-2 ; j >= i; j--)
- {
- if (a[j] > a[j+1])
- {
- swap(&a[j], &a[j+1]);
- flag = 1;
- }
- }
- }
- }
- //簡單選擇排序
- //時間複雜度O(n^2) 空間複雜度O(1)
- void select_sort(int a[], int n)
- {
- int i, j, min;
- for (i = 0; i < n ; i++)
- {
- min = i;
- for (j = i+1; j < n; j++)
- {
- if (a[j] < a[min])
- {
- min = j;
- }
- }
- if (min != i)
- {
- swap(&a[min], &a[i]);
- }
- }
- }
- //直接插入排序
- //時間複雜度O(n^2) 空間複雜度O(1)
- void insert_sort(int a[], int n)
- {
- for (int i = 0; i < n ; i++)
- {
- int temp = a[i];
- int j = i-1;
- while (j>=0 && a[j] > temp)
- {
- a[j+1] = a[j];
- j--;
- }
- a[j+1] = temp;
- }
- }
- //希爾排序
- //時間複雜度為O(nlogn) 空間複雜度為O(1)
- void shell_sort(int a[], int n)
- {
- int i,j,temp;
- int gap = 0;
- while (gap <= n) gap = gap*3+1;
- while (gap > 0)
- {
- for (i = gap; i < n; i++)
- {
- temp = a[i];
- j = i - gap;
- while (j >= 0 && a[j] > temp)
- {
- a[j+gap] = a[j];
- j = j - gap;
- }
- a[j+gap] = temp;
- }
- gap = (gap-1)/3;
- }
- }
- //堆排序
- //時間複雜度為O(nlogn) 空間複雜度為O(1)
- void heap_sort(int a[], int n)
- {
- for (int i = n/2 - 1; i >= 0; i--)
- {
- heap_adjust(a, i, n);
- }
- for (int i = n-1; i > 0; i--)
- {
- swap(&a[0], &a[i]);
- heap_adjust(a, 0, i);
- }
- }
- //構建大頂堆
- void heap_adjust(int a[], int i, int n)
- {
- int child, temp;
- for (temp = a[i]; 2*i+1 < n; i = child)
- {
- child = 2*i+1;
- //取得較大子結點索引
- if (child < n -1 && a[child] < a[child+1]) child++;
- //保證父結點大於等於子結點
- if (temp < a[child]) swap(&a[i], &a[child]);
- else break;
- }
- }
- //快速排序
- //時間複雜度為O(nlogn) 空間複雜度為O(logn) ~ O(n)
- void quick_sort(int a[], int low, int high)
- {
- int i = low+1;
- int j = high;
- int key = a[low];
- if (low >= high) return;
- while (1) {
- while (key<a[j]) j--;
- while (key>a[i] && i<j) i++;
- if (i >= j) break;
- swap(&a[i], &a[j]);
- if (a[i] == key) j--;
- else i++;
- }
- swap(&a[low], &a[j]);
- if (i-1>low) quick_sort(a, low, i-1);
- if (j+1<high) quick_sort(a, j+1, high);
- }
c语言排序
最新推荐文章于 2021-11-20 16:14:26 发布