[关闭]
@haoqiang 2018-03-03T10:01:59.000000Z 字数 2393 阅读 36

排序

算法


交换

  1. void swap(int array[], int i, int j)
  2. {
  3. int temp = array[i];
  4. array[i] = array[j];
  5. array[j] = temp;
  6. }

冒泡排序
从后往前,相邻元素比较交换,每遍历一次,当前最小值归位。
时间复杂度:O(n2)。

  1. void BubbleSort(int array[], int n)
  2. {
  3. bool flag = true;
  4. for (int i = 0; i < n - 1 && flag; i++)
  5. {
  6. flag = false;
  7. for (int j = n - 1; j > i; j--)
  8. {
  9. if (array[j - 1] > array[j]) {
  10. swap(array, j, j - 1);
  11. flag = true;
  12. }
  13. }
  14. }
  15. }

简单选择排序
寻找当前最小值放在前面。
时间复杂度:O(n2)。

  1. void SelectSort(int array[], int n)
  2. {
  3. int min;
  4. for (int i = 0; i < n - 1; i++)
  5. {
  6. min = i;
  7. for (int j = i + 1; j <= n - 1; j++)
  8. {
  9. if (array[min] > array[j])
  10. min = j;
  11. }
  12. if (min != i)
  13. swap(array, min, i);
  14. }
  15. }

直接插入排序
将后面的值插入到前面已排序的序列中。
时间复杂度:O(n2)。

  1. void InsertSort(int array[], int n)
  2. {
  3. int i, j, key;
  4. for (i = 1; i < n; i++) {
  5. if (array[i] < array[i - 1]) {
  6. key = array[i];
  7. for (j = i - 1; array[j] > key; j--)
  8. array[j + 1] = array[j];
  9. array[j + 1] = key;
  10. }
  11. }
  12. }

希尔排序
部分有序。
时间复杂度:O(n2/3)。

  1. void ShellSort(int array[], int n) {
  2. int i, j, key;
  3. int increment = n-1;
  4. do {
  5. increment = increment / 3+1;
  6. for (i = increment+1; i < n; i++) {
  7. if (array[i] < array[i - increment]) {
  8. key = array[i];
  9. for (j = i - increment; j >= 0 && key < array[j]; j -= increment)
  10. array[j + increment] = array[j];
  11. array[j + increment] = key;
  12. }
  13. }
  14. }
  15. while (increment > 1);
  16. }

归并排序

时间复杂度:O(nlogn)。

  1. void merge(int *data, int start, int end, int *result)
  2. {
  3. int left_length = (end - start + 1) / 2 + 1;//左部分区间的数据元素的个数
  4. int left_index = start;
  5. int right_index = start + left_length;
  6. int result_index = start;
  7. while (left_index < start + left_length && right_index < end + 1)
  8. {
  9. //对分别已经排好序的左区间和右区间进行合并
  10. if (data[left_index] <= data[right_index])
  11. result[result_index++] = data[left_index++];
  12. else
  13. result[result_index++] = data[right_index++];
  14. }
  15. while (left_index < start + left_length)
  16. result[result_index++] = data[left_index++];
  17. while (right_index < end + 1)
  18. result[result_index++] = data[right_index++];
  19. }
  20. void merge_sort(int *data, int start, int end, int *result)
  21. {
  22. if (1 == end - start)//如果区间中只有两个元素,则对这两个元素进行排序
  23. {
  24. if (data[start] > data[end])
  25. {
  26. int temp = data[start];
  27. data[start] = data[end];
  28. data[end] = temp;
  29. }
  30. return;
  31. }
  32. else if (0 == end - start)//如果只有一个元素,则不用排序
  33. return;
  34. else
  35. {
  36. //继续划分子区间,分别对左右子区间进行排序
  37. merge_sort(data, start, (end - start + 1) / 2 + start, result);
  38. merge_sort(data, (end - start + 1) / 2 + start + 1, end, result);
  39. //开始归并已经排好序的start到end之间的数据
  40. merge(data, start, end, result);
  41. //把排序后的区间数据复制到原始数据中去
  42. for (int i = start; i <= end; ++i)
  43. data[i] = result[i];
  44. }
  45. }

快速排序

时间复杂度:O(nlogn)。

  1. int Partition(int array[], int low, int high) {
  2. int pivotkey;
  3. pivotkey = array[low];
  4. while (low < high) {
  5. while (low < high&&array[high] >= pivotkey)
  6. high--;
  7. swap(array, low, high);
  8. while (low < high&&array[low] <= pivotkey)
  9. low++;
  10. swap(array, low, high);
  11. }
  12. return low;
  13. }
  14. void QSort(int array[], int low, int high)
  15. {
  16. int pivot;
  17. if (low < high) {
  18. pivot = Partition(array, low, high);
  19. QSort(array, low, pivot-1);
  20. QSort(array, pivot + 1, high);
  21. }
  22. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注