标签:排序总结
冒泡排序:O(N^2)。输入对结果没有影响。
插入排序:最差O(N^2),最优O(N),平均O(N^2)。输入有影响,例如已排好序,则为O(N)。
选择排序:最差,最优,平均都是O(N^2)。输入对结果没有影响。
希尔排序:最差为o(Nlg^2N)。缩小增量排序。关键是如何选取这个增量序列。(一般,但不够好的选择是 k/2)。
堆排序:最差,最优,平均都是O(NlgN)。堆排序是所有下界排序为O(NlgN)中唯一一个稳定的排序。
归并排序:O(NlgN)。归并排序,需要一个额外的数组空间,因此是非原址排序。
快速排序:最差O(N^2),最优和平均O(NlgN)。输入有影响。(快速排序针对输入为随机的数据性能比较好)。
外部排序:待补充。
冒泡排序算法的运作如下:
void bubble_sort(int arr[], int len) <span style="color: rgb(37, 37, 37); font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">冒泡排序</span> { int i, j, temp; for (i = 0; i < len - 1; i++) for (j = 0; j < len - 1 - i; j++) if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } }
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
void insertion_sort(int array[], int first, int last)插入排序 { int i, j, temp; for (i = first + 1; i <= last; i++){ temp = array[i]; for(j = i - 1; j >= first && array[j] > temp;j--) array[j + 1] = array[j]; array[j+1] = temp; } }
void selection_sort(int arr[], int len) { int i, j, min, temp; for (i = 0; i < len - 1; i++) { min = i; for (j = i + 1; j < len; j++) if (arr[min] > arr[j]) min = j; if (min != i) { temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } }
void shell_sort(int arr[], int len) { int gap, i, j; int temp; for (gap = len >> 1; gap > 0; gap >>= 1) for (i = gap; i < len; i++) { temp = arr[i]; for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap) arr[j + gap] = arr[j]; arr[j + gap] = temp; } }堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义以下几种操作:
void Max_Heapify(int A[], int i, int heap_size) { int l = left(i); int r = right(i); int largest; int temp; if(l < heap_size && A[l] > A[i]) { largest = l; } else { largest = i; } if(r < heap_size && A[r] > A[largest]) { largest = r; } if(largest != i) { temp = A[i]; A[i] = A[largest]; A[largest] = temp; Max_Heapify(A, largest, heap_size); } } void Build_Max_Heap(int A[],int heap_size) { for(int i = (heap_size-2)/2; i >= 0; i--) { Max_Heapify(A, i, heap_size); } } void HeapSort(int A[], int heap_size) { Build_Max_Heap(A, heap_size); int temp; for(int i = heap_size - 1; i >= 0; i--) { temp = A[0]; A[0] = A[i]; A[i] = temp; Max_Heapify(A, 0, i); } print(A, heap_size); }
快速排序:http://blog.csdn.net/csdnjack_/article/details/45459283
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:排序总结
原文地址:http://blog.csdn.net/csdnjack_/article/details/48090799