插入排序(1)InsertionSort
2012-04-30 01:39
459 查看
main.cc
/*----------------------------------------------- Created By EverSteins Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/ #include "stdafx.h" #include <iostream> using namespace std; //冒泡排序和选择排序一样,都有固定的比较次数,但冒泡排序每次比较一定要相互交换值,所以效率很低 void BubbleSort(int *p,int n) { for (int i=0;i<n-1;++i) { for (int j=0;j<n-i-1;++j) { if (p[j+1]<p[j]) { int tmp=p[j]; p[j]=p[j+1]; p[j+1]=tmp; } } } } void InsertionSort1(int *arr,int n) { if (n<1) return; for (int i=1;i<n;++i) //n次i<n { int tmp=arr[i]; //n-1 int j=i; //n-1 for (;j>0 && tmp<arr[j-1];--j) //可见算法导论。j>0 (n-1)tj次,tmp<arr[j-1]为(n-2)tj次。注意是<不是<=,否则排序不稳定 arr[j]=arr[j-1]; arr[j]=tmp; } } void InsertionSort2(int *arr,int n) { if (n<1) return; for (int i=1;i<n;++i) { if (arr[i]<arr[i-1]) //一共比较n-1次 { int tmp=arr[i]; int j=i; for (;j>0 && arr[j-1]>tmp;--j) //比较最多i次,最少2次,i取自[1,n-1] arr[j]=arr[j-1]; arr[j]=tmp; //一共n-1次 } } } //插入排序的性能优化版 //在sgi stl的插入排序方法中就采用了这种思想,不过实现方法有些不同且复杂得多。。。 //在第i个待排序元素与它前一个已排序元素比较失败时(即已经顺序),这种情况下,比InsertionSort1少了int tmp=arr[i];arr[j+1]=tmp;少了2次赋值 //在赋值操作需要花费很多时间,或n输入很大时,性能能提升一些,虽然不能改变它O(n^2)的复杂度。。。 void InsertionSort4(int *arr,int n) { if (n<1) return; for (int i=1;i<n;++i) //n次i<n { if (arr[i]<arr[i-1]) { int tmp=arr[i]; int j=i; do { arr[j]=arr[j-1]; --j; }while (j>0 && arr[j-1]>tmp); //比InsertionSort2少1次比较 arr[j]=tmp; //do...while与while区别在于do...while少1次比较,即循环体内的语句执行次数一样且 //且第1次比较以决定是否执行循环体,由于这里第一次条件肯定满足,所以可以写成 //do...while形式 /*如果准备排序的那个元素要移动位置,则移动次数,即arr[j]=arr[j-1];(arr[j-1]>tmp同)执行次数 最多i次,最少1次,i取自[1,n-1],n>=2 平均为(i+1)/2次,由(1+2+...+i)/i推导得出 比较次数共:1/(i+1)+i/(i+1) */ } } } int _tmain(int argc, _TCHAR* argv[]) { int arr[6]={23,-99,-15,2,99,98}; int arr2[6]={-123,-99,-15,2,90,98}; int arr3[6]={98,90,2,-15,-99,-123}; InsertionSort3(arr3,6); for (int i=0;i<6;++i) cout<<arr3[i]<<","; cout<<endl; cin.get(); return 0; }
相关文章推荐
- 排序算法总结之插入排序 Insertion Sort
- 173. 链表插入排序 (insertion-sort-list)(c++)----lintcode面试题之链表
- 插入排序(InsertionSort)
- Insertion Sort List 使用插入排序将链表排序
- 插入排序(insertion sort)算法实现
- insertion sort 插入排序
- LeetCode Insertion Sort List(单链表插入排序)
- [C++]LeetCode: 126 Insertion Sort List (插入排序链表)
- 经典排序算法 – 插入排序Insertion sort
- [LeetCode147]Insertion Sort List(链表插入排序)
- 【LeetCode-面试算法经典-Java实现】【147-Insertion Sort List(链表插入排序)】
- 插入排序(Insertion Sort)
- 【算法】插入排序 insertion_sort
- 静态链表插入排序(List Insertion Sort)算法
- 排序算法 之 插入排序InsertionSort
- 插入排序(Insertion Sort)
- AOJ-ALDS1_1_A Insertion Sort【插入排序】
- 算法排序--插入排序(insertion sort)
- 算法:插入排序(Insertion Sort)
- [硕.Love Python] InsertionSort(插入排序)