经典算法之直接插入排序及其优化

来源:互联网 发布:帝国全面战争 知乎 编辑:程序博客网 时间:2024/06/05 08:39
/************************author's email:wardseptember@gmail.comdate:2017.12.9直接插入排序************************//*每一趟将一个待排序的关键字按照其值得大小插入到已经排序好的部分有序序列的适当位置上,直到所有待排序关键字都被插入到有序序列中为止。第一趟,把第一个关键字看做有序列的,从第二关键字开始插入。*/#include<iostream>#define maxSize 10using namespace std;void directlyInsertSort1(int D[], int n);//直接插入排序void directlyInsertSort2(int D[], int n);//直接插入排序改进void printArray(int D[], int n);//输出数组void main() {int D[maxSize] = {12,15,48,46,16,78,57,88,65,48};//构造一个一维数组int E[maxSize] = { 12,15,48,46,16,78,57,88,65,48 };directlyInsertSort1(D, maxSize);//直接插入排序数组cout << "直接插入排序后,结果为:" << endl;printArray(D, maxSize);//输出数组directlyInsertSort2(E, maxSize);//直接插入排序,由于上面执行完D数组已经有序,这我们构造一个与D数组完全相同的E数组进行测试。cout << "改进的直接插入排序后,结果为:"<<endl;printArray(E, maxSize);}void directlyInsertSort1(int D[], int n) {//直接插入排序,D为要排序的数组,n为D中关键字的个数int i, j;int temp;for (i = 1; i < n; ++i) {//初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1temp = D[i];   //将待排关键字存入temp中j = i - 1;     //j为D[i]前一个关键字的下标//这个循环用于从待排关键字的前一个关键字开始比较,如果大于待排关键字就后移一位while (j >= 0 && temp < D[j]) {D[j + 1] = D[j];--j;}D[j + 1] = temp;//找到插入位置,将temp插入。j最后-1,所以这里加1。}}/*改进的思想是:在循环刚开始时加上一句判断,若D[i]>=D[i-1]说明D[0...i]本身就是有序的,无需调整,否则按就第一种方法调整。显而易见,某些情况下第二种方法比第一种方法效率要高*/void directlyInsertSort2(int D[], int n) {int i, j;int temp;for (i = 1; i < n; ++i) {    //初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1if (D[i] < D[i - 1]) {//判断是否调整temp = D[i];   //将待排关键字存入temp中j = i - 1;     //j为D[i]前一个关键字的下标 //这个循环用于从待排关键字的前一个关键字开始比较,如果大于待排关键字就后移一位while (j >= 0 && temp < D[j]) {D[j + 1] = D[j];--j;}D[j + 1] = temp;//找到插入位置,将temp插入。j最后-1,所以这里加1。}}}void printArray(int D[], int n) {for (int i = 0; i < n; ++i)  //输出排序后的关键字cout << D[i] << " ";cout << endl;}
以上如有错误,请指出,大家共同学习进步
原创粉丝点击