插入排序 给出一下四种方法:
直接插入排序,折半插入排序,二路插入排序,希尔插入排序
代码实现:
#include<iostream> using namespace std; #define size 21 typedef int Sqlist[size]; void SInsertSort(Sqlist &L, int n) //直接插入 { cout << "直接插入排序" << endl; for (int i = 2; i < n; ++i) { if (L[i] < L[i - 1]) //判断i与i-1位置的大小 { L[0] = L[i]; //将i位置赋值给哨兵位 int j; for (j = i - 1; L[0] < L[j]; --j) { L[j + 1] = L[j]; //循环后移 } L[j + 1] = L[0]; } } } void BInsertSort(Sqlist &L, int n) { cout << "折半插入排序" << endl; for (int i = 2; i < n; ++i) { L[0] = L[i]; int low = 1; int high = i - 1; int mid = 0; while (low <= high) { mid = (low + high) / 2; if (L[0] < L[mid]) { high = mid - 1; } else { low = mid + 1; } } for (int j = i - 1; j >= high + 1; --j) { L[j + 1] = L[j]; //循环后移 } L[high + 1] = L[0]; } } void TWInsertSort(Sqlist &L, int n) //2—路插入排序 { cout << "二路插入排序" << endl; Sqlist T; T[0] = L[0]; int first; int last; first = last = 0; for (int i = 1; i < n; ++i) { if (L[i] < T[first]) { first = (first - 1 + n) % n; T[first] = L[i]; } else if (L[i] > T[last]) { last++; T[last] = L[i]; } else { last++; T[last] = T[last - 1]; int j = last - 1; for (; L[i] < T[(j - 1 + n) % n]; j = (j - 1 + n) % n) { T[j] = T[(j - 1 + n) % n]; } T[j] = L[i]; } } for (int i = 0; i < n; ++i) { L[i] = T[first]; first = (first + 1) % n; } } void ShellInsert(Sqlist &L, int n, int dk)//希尔插入 { int t; for (int i = dk + 1; i <= n; ++i) //按增量变化 { if (L[i] < L[i - dk]) //比较大小 { t = L[i]; int j = i - dk; for (; j>0 && t<L[j]; j -= dk) { L[j + dk] = L[j]; } L[j + dk] = t; //赋值 } } } void ShellSort(Sqlist &L, int n, int dlta[], int t)//希尔排序 { for (int k = 0; k < t; ++k) //按照增量数组值重复插入排序 { ShellInsert(L, n, dlta[k]); } } void main() { Sqlist sq = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//0为哨兵位 cout << "原数组为:" << endl; for (int i = 1; i < 9; ++i) { cout << sq[i]<<' '; } cout << endl; SInsertSort(sq,9); for (int i = 1; i < 9; ++i) { cout << sq[i] << ' '; } cout << endl; BInsertSort(sq, 9); for (int i = 1; i < 9; ++i) { cout << sq[i] << ' '; } cout << endl; Sqlist Sq = { 49, 38, 65, 97, 76, 13, 27, 49 }; cout << "原数组为:" << endl; for (int i = 0; i < 8; ++i) { cout << Sq[i]<<' '; } cout << endl; TWInsertSort(Sq, 8); for (int i = 0; i < 8; ++i) { cout << Sq[i] << ' '; } cout << endl; Sqlist sQ = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//哨兵位 cout << "原数组为:"<<endl; for (int i = 1; i <= 8; ++i) //打印sQ { cout << sQ[i] << " "; } cout << endl; int dlta[] = { 5, 3, 1 }; //增量数组 ShellSort(sQ, 8, dlta, sizeof(dlta) / sizeof(int));//希尔排序 cout << "希尔排序:" << endl; for (int j = 1; j <= 8; ++j) { cout << sQ[j] << " "; } cout << endl; }