另外还有基数排序,计数排序,桶排序等,暂时没有时间看。先把上面这些的c语言代码写一下,并且简略提一下原理。
插入排序:对于未排序的数据,在已排序数据中从后向前扫描,找到相应位置插入.(第一个元素当做已排序)扫描过程中需要反复把已排序的元素逐步向后移动,为新元素提供插入空间。
1 void insertion_sort(int *a, int len) //调用insertion_sort(a, len) 2 { 3 int i, j, key; //key是待排序数 4 for (i = 1; i < len; ++i) 5 { 6 key = a[i]; 7 j = i - 1; 8 while (j >= 0 && key < a[j]) //逐个后移 9 { 10 a[j+1] = a[j]; 11 --j; 12 } 13 a[j+1] = key; 14 } 15 }
选择排序:首先找到数组a中最小元素与a【1】交换,再次小元素与a【2】交换,对a中前n-1个元素继续此过程。
void selection_sort(int *a, int len) //调用selection_sort(a, len) { int i, j, k, t; for (i = 0; i < len - 1; ++i) { k = i; for (j = i + 1; j < len; ++j) if (a[k] > a[j]) k = j; t = a[i]; a[i] = a[k]; a[k] = t; } }
归并排序:
1 void merge(int *a, int *temp_array, int lpos, int rpos, int right_end) 2 { 3 int i, left_end, num_element, tmp_pos; 4 left_end = rpos - 1; 5 tmp_pos = lpos; 6 num_element = right_end - lpos + 1; 7 while (lpos <= left_end && rpos <= right_end) 8 { 9 if (a[lpos] <= a[rpos]) 10 temp_array[tmp_pos++] = a[lpos++]; 11 else 12 temp_array[tmp_pos++] = a[lpos++]; 13 } 14 while (lpos <= left_end) 15 temp_array[tmp_pos++] = a[lpos++]; 16 while (rpos <= right_end) 17 temp_array[tmp_pos++] = a[rpos++]; 18 for (i = 0; i < num_element; ++i, right_end--) 19 a[right_end] = temp_array[right_end]; 20 } 21 void merge_sort(int *a, int *temp_array, int left, int right) //调用merge_sort(a, t, 0, len - 1) 22 { 23 int mid; 24 if (left < right) 25 { 26 mid = (left + right) / 2; 27 merge_sort(a, temp_array, left, mid); 28 merge_sort(a, temp_array, mid + 1, right); 29 merge(a, temp_array, left, mid + 1, right); 30 } 31 }
冒泡排序:重复交换相邻的两个反序元素。
1 void bubble_sort(int *a, int len) 2 { 3 int i, j, t; 4 for (i = 0; i < len; ++i) 5 for (j = len - 1; j > i; --j) 6 if (a[j] < a[j-1]) 7 { 8 t = a[j]; 9 a[j] = a[j-1]; 10 a[j-1] = t; 11 } 12 }
希尔排序(shell):缩小增量排序,将待排序列划分为若干个较小的序列,分别进行直接插入排序,是需要排序的数列基本有序,最后再用依稀直接插入排序。一般取上一增量的一半作为此次划分的增量,直到增量为1.
1 void shell_sort(int *a, int len) 2 { 3 int gap, i, j, t; 4 for (gap = len / 2; gap > 0; gap /= 2) 5 for (i = gap; i < len; ++i) 6 for (j = i - gap; j >=0 && a[j] > a[j+gap]; j -= gap) 7 { 8 t = a[j]; a[j] = a[j+gap]; a[j+gap] = t; 9 } 10 }
堆排序:
1 void swap(int *a, int *b) 2 { 3 int t = *a; *a = *b; *b = t; 4 } 5 void max_heapify(int *a, int i, int heapsize) 6 { 7 int l = 2 * i + 1; 8 int r = 2 * i + 2; 9 int largest; 10 if (l <= heapsize - 1 && a[l] > a[i]) 11 largest = l; 12 else 13 largest = i; 14 if (r <= heapsize - 1 && a[r] > a[i]) 15 largest = r; 16 if (largest != i) 17 { 18 swap(&a[i], &a[largest]); 19 max_heapify(a, largest, heapsize); 20 } 21 } 22 void build_max_heap(int *a, int heapsize) 23 { 24 int i; 25 for (i = heapsize / 2 - 1; i >= 0; --i) 26 max_heapify(a, largest, heapsize); 27 } 28 void heap_sort(int *a, int len) 29 { 30 int i; 31 build_max_heap(a, len); 32 for (i = len - 1; i >= 1; --i) 33 { 34 swap(&a[0], &a[i]); 35 max_heapify(a, 0, i); 36 } 37 }
快速排序:
void swap(int *a, int *b) { int t = *x; *x = *y; *y = t; } int partition(int *a, int p, int r) { int x = a[r]; int i = p - 1; int j; for (j = 0; j <= r - 1; ++j) { if (a[j] <= x) { ++i; swap(&a[i], &a[j]); } } swap(&a[i+1], &a[r]); return i + 1; } void quick_sort(int *a, int p, int r) //调用(a, 0, len - 1) { if (p < r) { int q = partition(a, p, r); quick_sort(a, p, q - 1); quick_sort(a, q + 1, r); } }