排序的详细分类
排序分为外部排序和内部排序,其中平时主要学习的是内部排序。
内部排序主要分为5大类:(ps:其中计数排序一般不做分析)
- 插入排序:
- 直接插入排序:每次处理就是将无序的数列中第一个元素与有序数列的元素从后到前比较,找到插入位置,将该元素插入到有序数列的适当的最终的位置上(稳定排序)。
算法过程
/*直接插入排序*/ #include<stdio.h> void insertSort(int arr[], int length); int main() { int a[5] = { 5,2,3,4,1 }; insertSort(a, 5); for (int i = 0; i < 5; i++) printf("%5d", a[i]); } void insertSort(int arr[], int length) { int i, j, k; for (i = 1; i < length; i++) { if (arr[i] < arr[i - 1]) { k = arr[i]; for (j = i - 1; arr[j] > k && j >= 0; j--) {//待插元素小于当前元素 arr[j + 1] = arr[j]; } arr[j + 1] = k; } } }
2.折半插入排序
算法过程
/*折半插入排序: 将一个新元素插入打已经拍好像的数组的过程,mid=(low+high)/2, 判断插入元素是否小于参考元素,若是则选择low-high(high=mid-1)为插入区间, 反之则选择low(low=mid+1)-high,直到low>high时,即将此位置之后所有元素后移一位,并将新元素插入a[high+1]*/ #include<stdio.h> int main() { void BinSort(int a[], int n); void put(int r[], int n); int arr[] = { 9,8,7,6,5,4,3,2,1 }; BinSort(arr, 9); put(arr, 9); } void BinSort(int a[], int n) { int i, j, high,low, mid,t; for (i = 1; i < n; i++) { low = 0; high = i - 1; t = a[i]; while (low<=high) { mid = (low + high) / 2; if (t < a[mid]) { high = mid - 1; } else { low = mid + 1; } } for (j = i - 1; j >=high+1; j--) {//high+1的元素后移 a[j + 1] = a[j]; } a[j + 1] = t;//插入选定的地点 } }
脚踏实地,注重基础。