排序算法(三):插入排序
非常插入排序easy。像扑克。
卡的手4,再次卡5在本能地放置在第一张牌的权利。
假设一3然后从右到左扫描。只有被插入到左边的比这个数字大容量交换。
插入排序是一种稳定的排序方法,时间复杂度O(n*n),空间复杂度O(1),最好的情况下时间复杂度为O(1).即本来就是一个有序或者相等的数组,则仅仅需比較n-1次就可以。下为源代码,仅仅需三行代码就可以。
//============================================================================ // Name : QuikSort.cpp // Author : YanZi // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <malloc.h> using namespace std; void swap1(int a, int b); void printArray(int* in, int n); void quickSort1(int* x, int l, int r);//双边扫描,高速排序 void quickSort2(int x[], int l, int r);//单边扫描。高速排序 void swap2(int &a,int &b); //交换,在MinGW上必须採用此方法,swap1无效 #define N 8 //数组的长度 int main() { int* input = NULL; input = (int*)malloc(N * sizeof(int)); if(input == NULL){ cout<<"内存溢出"<<endl; } for(int i = 0; i < N; i++){ input[i] = rand(); } // int input[] = {55, 41, 59, 26, 53, 58, 97, 93}; cout<<"原始数据:"<<endl; printArray(input, N); quickSort2(input, 0, N-1); printArray(input, N); return 0; } void swap1(int a, int b){ int temp = a; a = b; b = temp; } void printArray(int * in, int n){ if(in == NULL){ return; } for(int i = 0; i<n; i++){ cout<<" "<<in[i]; } cout<<endl; } void quickSort1(int* x, int l, int r){ if(l < r){ int i = l, j = r, key = x[l]; while(i < j){ while( i < j && x[j] >= key){ j--; } if(i < j){ x[i++] = x[j]; } while(i < j && x[i] <= key){ i++; } if(i < j){ x[j--] = x[i]; } } cout<<"i = " <<i<<" j = "<<j<<endl; x[i] = key; quickSort1(x, l, i-1); quickSort1(x, i+1, r); } } void quickSort2(int x[], int l, int r){ if(l >= r) return; int m = l; for(int i = l + l; i <= r; i++ ){ if(x[i] < x[l]){ swap2(x[++m], x[i]); } } swap2(x[l], x[m]); quickSort2(x, l, m - 1); quickSort2(x, m + 1, r); } void swap2(int &a,int &b){ if(a==b) return;//对同一地址的数据交换。会使其结果为0 a=a^b; b=a^b; a=a^b; }
插入排序一个主要特征:理想的基本有序阵列,准确的分类。
版权声明:本文博主原创文章。博客,未经同意不得转载。