1. 程式人生 > 其它 >簡述幾大基本排序(c語言實現)

簡述幾大基本排序(c語言實現)

因為筆者資料結構要考試了,所以在這裡總結了一些用c語言實現的幾大排序方法,希望對於c語言以及要考試的uu們能夠有所幫助。(這裡先列舉一些方法,等筆者考完試就來完善)

一、氣泡排序

void BubbleSort(int a[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (a[j] > a[j + 1]) { int t = a[j + 1]; a[j + 1] = a[j]; a[j] = t; } } } return; }

二、快速排序

void QuickSort(int a[], int low, int high) { int i = low; int j = high; int t = a[i]; if (i >= j) { return; } while (i < j) { while (i<j&&a[j]>t) { j--; } if (a[j] < t&& i < j) { a[i++] = a[j]; } while (i < j&&a[i] < t) { i++; } if (a[i] > t && i < j) { a[j--] = a[i]; } } a[i] = t; QuickSort(a, low, i - 1); QuickSort(a, i + 1, high); }

三、堆排序

void HeapAdjust(int a[],int v,int n) { int i; int t = a[v]; for (i = 2 * v + 1; i < n; i = 2 * i + 1) { if (a[i + 1] > a[i]&&i+1<n) { i++; } if (t > a[i]) break; a[v] = a[i]; v = i; } a[v] = t; return; } void HeapSort(int a[], int n) { for (int i = n / 2-1; i >= 0; i--) { HeapAdjust(a, i, n); } for (int j = n - 1; j >= 0; j--) { int t = a[j]; a[j] = a[0]; a[0] = t; HeapAdjust(a, 0, j); } return; }

四、歸併排序

void merge(int a[], int left,int mid,int right, int t[]) { int i = left; int j = mid + 1; int k = left; while (i <= mid && j <= right) { if (a[i] < a[j]) { t[k++] = a[i++]; } else { t[k++] = a[j++]; } } while (i <= mid) { t[k++] = a[i++]; } while (j <= right) { t[k++] = a[j++]; } memcpy(a + left, t + left, sizeof(int)*(right - left + 1)); return; } void MergeSort(int a[], int left,int right,int t[]) { if (left >= right) return; int mid = (left + right) / 2; MergeSort(a, left, mid,t); MergeSort(a, mid + 1, right,t); merge(a, left, mid, right, t); }

五、簡單插入排序

void InsertSort(int a[], int n) { int i, j; for (i = 1; i <n; i++) { if (a[i - 1] > a[i]) { int t = a[i]; for (j = i - 1; j >= 0 && a[j]>t; j--) { a[j + 1] = a[j]; } a[j + 1] = t; } } return; }

六、選擇排序

void SelectSort(int a[], int n) { int v; int i, j; for (i = 0; i < n; i++) { int v = i; int min = a[i]; for (j = i + 1; j < n; j++) { if (a[j] < min) { v = j; min = a[j]; } } if (v != i) { int temp = a[i]; a[i] = a[v]; a[v] = temp; } } return; }

七、希爾排序

void ShellSort(int a[], int n) { int gap, i, j, k; for (gap = n / 2; gap > 0; gap /= 2) { for (i = 0; i < gap; i++) { for (j = i + gap; j < n; j+=gap) { if (a[j - gap] > a[j]) { int t = a[j]; for (k = j - gap; k >= 0 && a[k] > t; k-=gap) { a[k + gap] = a[k]; } a[k + gap] = t; } } } } return; }

以下是程式碼整體以及測試主函式

#include<stdio.h> \#include<stdlib.h> \#include<string.h> //氣泡排序 void bubblesort(int a[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (a[j] > a[j + 1]) { int t = a[j + 1]; a[j + 1] = a[j]; a[j] = t; } } } return; } void BubbleSort(int a[], int n) { bubblesort(a, n); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } } //快速排序 void quicksort(int a[], int low, int high) { int i = low; int j = high; int t = a[i]; if (i >= j) { return; } while (i < j) { while (i<j&&a[j]>t) { j--; } if (a[j] < t&& i < j) { a[i++] = a[j]; } while (i < j&&a[i] < t) { i++; } if (a[i] > t && i < j) { a[j--] = a[i]; } } a[i] = t; quicksort(a, low, i - 1); quicksort(a, i + 1, high); } void QuickSort(int a[], int low,int n) { quicksort(a, low, n-1); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } } //堆排序 void HeapAdjust(int a[],int v,int n) { int i; int t = a[v]; for (i = 2 * v + 1; i < n; i = 2 * i + 1) { if (a[i + 1] > a[i]&&i+1<n) { i++; } if (t > a[i]) break; a[v] = a[i]; v = i; } a[v] = t; return; } void heapsort(int a[], int n) { for (int i = n / 2-1; i >= 0; i--) { HeapAdjust(a, i, n); } for (int j = n - 1; j >= 0; j--) { int t = a[j]; a[j] = a[0]; a[0] = t; HeapAdjust(a, 0, j); } return; } void HeapSort(int a[], int n) { heapsort(a, n); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } } //歸併排序 void merge(int a[], int left,int mid,int right, int t[]) { int i = left; int j = mid + 1; int k = left; while (i <= mid && j <= right) { if (a[i] < a[j]) { t[k++] = a[i++]; } else { t[k++] = a[j++]; } } while (i <= mid) { t[k++] = a[i++]; } while (j <= right) { t[k++] = a[j++]; } memcpy(a + left, t + left, sizeof(int)*(right - left + 1)); return; } void mergesort(int a[], int left,int right,int t[]) { if (left >= right) return; int mid = (left + right) / 2; mergesort(a, left, mid,t); mergesort(a, mid + 1, right,t); merge(a, left, mid, right, t); } void MergeSort(int a[], int left, int right, int t[]) { mergesort(a, left, right, t); for (int i = 0; i < right + 1; i++) { printf("%d ", a[i]); } } //插入排序 void insertsort(int a[], int n) { int i, j; for (i = 1; i <n; i++) { if (a[i - 1] > a[i]) { int t = a[i]; for (j = i - 1; j >= 0 && a[j]>t; j--) { a[j + 1] = a[j]; } a[j + 1] = t; } } return; } void InsertSort(int a[], int n) { insertsort(a, n); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } return; } //選擇排序 void selectsort(int a[], int n) { int v; int i, j; for (i = 0; i < n; i++) { int v = i; int min = a[i]; for (j = i + 1; j < n; j++) { if (a[j] < min) { v = j; min = a[j]; } } if (v != i) { int temp = a[i]; a[i] = a[v]; a[v] = temp; } } return; } void SelectSort(int a[], int n) { selectsort(a, n); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } } //希爾排序 void shellsort(int a[], int n) { int gap, i, j, k; for (gap = n / 2; gap > 0; gap /= 2) { for (i = 0; i < gap; i++) { for (j = i + gap; j < n; j+=gap) { if (a[j - gap] > a[j]) { int t = a[j]; for (k = j - gap; k >= 0 && a[k] > t; k-=gap) { a[k + gap] = a[k]; } a[k + gap] = t; } } } } return; } void ShellSort(int a[], int n) { shellsort(a, n); for (int i = 0; i < n; i++) { printf("%d ", a[i]); } } int main() { int a[10] = { 5,6,4,7,8,9,2,3,1,10 }; int n = 10; int t[10]; //BubbleSort(a, n); //QuickSort(a, 0, n); //HeapSort(a, n); //MergeSort(a, 0, n - 1, t); //InsertSort(a, n); //SelectSort(a, n); //ShellSort(a, n); system("pause"); return 0; }