茶楼呼叫器图片:重温数据结构写的几种常用排序方法,给新手参考 -

来源:百度文库 编辑:九乡新闻网 时间:2024/05/05 14:03:15
#include #include #include #include #include #include void print(int a[], int n){int i = 1;while(i<=n){printf("%d,", a[i]);i++;}printf("\n");return;}//直接插入排序,时间复杂度O(n^2),空间复杂度O(1),稳定排序//a[0]不参与排序,实际排序空间为a[1]~a[n]void InsertSort(int a[], int n){for(int i=2; i<=n; i++){if(a[i]0 && a[0]1);printf("ShellSort : ");print(a, n);return;}//冒泡排序,时间复杂度O(n^2),空间复杂度O(1),稳定排序void BubbleSort(int a[], int n){for(int i=1; i=i; j--){if(a[j+1]low && a[j]>a[0])j--;if(i<=j){tmp = a[i];a[i] = a[j];a[j] = tmp;i++;j--;}}if(j>low)QuickSort(a, low, j);if(ia[low])low++;if(low=a[j])break;a[s] = a[j];//    a[j] = a[0];        s = j;}a[s] = a[0];return;}//堆排序,最坏时间复杂度nlgn,空间复杂度为O(1),不稳定排序,适合大量数据的排序void HeapSort(int a[], int n){for(int j=n/2; j>0; j--)Heapify(a, j, n);for(int j=n; j>1; j--){a[0] = a[j];a[j] = a[1];a[1] = a[0];Heapify(a, 1, j-1);}printf("HeapSort : ");print(a, n);return;}//归并排序的一次合并过程void MergePass(int a[], int low, int mid, int high){int *p = (int*)malloc(sizeof(int)*(high-low+1));assert(p!=NULL);int *pi = p;int i = low, j = mid+1;while(i<=mid && j<=high)*(pi++) = (a[i]<=a[j])? a[i++] : a[j++];while(i<=mid)*(pi++) = a[i++];while(j<=high)*(pi++) = a[j++];pi = p;while(low<=high)a[low++] = *(pi++);free(p);return;}//归并排序,时间复杂度O(nlgn),空间复杂度O(n),稳定排序void MergeSort(int a[], int low, int high){if(low