7钟常见排序方法(C语言版)

 

 


//结构体


typedef struct
{
  int key;
}node;



//
直接插入排序 void zhijie_sort(node data[], int n, unsigned long long& compare, unsigned long long& move) { int i, j; for (int i = 2; i < n; i++) { node t; t=data[i]; j = i - 1; while (t.key < data[j].key) { data[j + 1] = data[j]; j--; compare++; move++; } data[j + 1] = t; } } //希尔排序 void slpx(node r[], int n, unsigned long long& compare, unsigned long long& move) { int j; int k; node t; int d = n / 2; while (d >= 1) { for (k = d; k < n; k++) { t = r[k]; move++; j = k - d; while (j >= 0 && t.key < r[j].key) { r[j + d] = r[j]; j -= d; move++; compare++; } r[j + d] = t; move++; } d /= 2; } } //冒泡排序 void mppx(node r[], int n, unsigned long long& compare, unsigned long long& move) { int i, j, k; node x; i = 1; k = 1; compare = 0; move = 0; while (i < n && k>0) { k = 0; for (j = 1; j < n - i; j++) { if (r[j + 1].key < r[j].key) { k++; x = r[j]; r[j] = r[j + 1]; r[j + 1] = x; compare++; move += 3; } } } } //快速排序 int partition(node r[], int low, int high, unsigned long long& compare, unsigned long long& move) { int i = low; int j = high; int t = r[i].key; do { while (t <= r[j].key && i < j) { j--; compare++; } if (i < j) { r[i] = r[j]; move++; i++; } while (r[i].key <= t && i < j) { i++; compare++; } if (i < j) { r[j] = r[i]; move++; j--; } } while (i < j); r[i].key = t; move++; return i; } void quicksort(node r[], int low, int high, unsigned long long& compare, unsigned long long& move) { int position; if (low < high) { position = partition(r, low, high, compare, move); quicksort(r, low, position - 1, compare, move); quicksort(r, position + 1, high, compare, move); } } //简单选择排序 void xzsort(node r[], int n, unsigned long long& compare, unsigned long long& move) { int i, j, k; node x; for (i = 1; i < n; i++) { k = i; for (j = i + 1; j <= n; j++) { if (r[j].key < r[k].key) { k = j; compare++; } if (i != k) { x = r[i]; r[i] = r[k]; r[k] = x; move += 3; } } } } //堆排序 void sift(node r[], int i, int j, unsigned long long& compare, unsigned long long& move) { node temp; int p = 2 * i; int t; while (p <= j) { t = p; if (p < j) { if (r[p].key < r[p + 1].key) { t = p + 1; compare++; } } if (r[i].key < r[t].key) { temp = r[i]; r[i] = r[t]; r[t] = temp; i = t; p = 2 * i; move += 3; compare++; } else break; } } void creatheap(node r[], int n, unsigned long long& compare, unsigned long long& move) { int k; for (k = n / 2; k >= 1; k--) { compare++; sift(r, k, n,compare,move); } } void heapsort(node r[], int n, unsigned long long& compare, unsigned long long& move) { int i; creatheap(r, n, compare, move); for (int i = n; i > 1; i--) { r[0] = r[i]; r[i] = r[1]; r[1] = r[0]; move += 3; sift(r, 1, i - 1, compare, move); } } //归并排序算法 void merge(node r[], int left, int mid, int right, unsigned long long& compare, unsigned long long& move) { int i = left, j = mid + 1, k = 0; node* tmpData = new node[right - left + 1]; while (i <= mid && j <= right) { compare++; if (r[i].key <= r[j].key) { tmpData[k++] = r[i++]; move++; } else { tmpData[k++] = r[j++]; move++; } } while (i <= mid) { tmpData[k++] = r[i++]; move++; } while (j <= right) { tmpData[k++] = r[j++]; move++; } for (int s = 0; s < k; s++) { r[left + s] = tmpData[s]; move++; } delete[] tmpData; } void mergeSort(node r[], int left, int right, unsigned long long& compare, unsigned long long& move) { if (left < right) { int mid = (left + right) / 2; mergeSort(r, left, mid, compare, move); mergeSort(r, mid + 1, right, compare, move); merge(r, left, mid, right, compare, move); } }

 



posted @ 2022-12-23 23:50  自在_随心  阅读(32)  评论(0)    收藏  举报