插入排序--(直接插入排序和希尔排序)
插入排序分为直接插入和希尔排序
直接插入的主要思想是:把要排序的数字插入到已经排好的数据中,从一组需要排序的数组中取出第一个元素,把它作为一个有序数组,然后取第二个元素,与前面的有序数组中的元素比较,找到合适的位置(大于i-1位置上的元素,小于i+1位置上的元素),直到把最后一个元素插入到有序数组中。
举例:为数组{8,5,7,4,1,2}排序
i=1 {5,8,7,4,1,2}
i=2 {5,7,8,4,1,2}
i=3 {4,5,7,8,1,2}
i=4 {1,4,5,7,8,2}
i=5 {1,2,4,5,7,8}
与实例代码如下:
// 插入排序.cpp : Defines the entry point for the console application. #include "stdafx.h" #include<iostream> using namespace std; void insert(int data[],int key) { for(int i =1;i<key;i++) { int key = data[i];//保存当前变量 int j = 0; for (j= i-1; j>=0 && key< data[j]; j--)//从当前变量的前一个变量查找key值应该插入的位置 { data[j+1] = data[j];//当前变量大于key值时,把当前元素后移 } data[j+1] = key;//将key元素插入到当前位置 } } int _tmain(int argc, _TCHAR* argv[]) { int array[10]={4,10,9,8,7,6,5,4,3,2}; for (int i = 0; i < 10; i++) { cout<<array[i]<<" "; } cout<<endl; insert(array,10); for (int i = 0; i < 10; i++) { cout<<array[i]<<" "; } while (true) { } return 0; }
希尔排序的思想是:
// 希尔排序.cpp : Defines the entry point for the console application. #include "stdafx.h" #include<iostream> using namespace std; void insert(int data[],int key) { int Add =0;//步长 int temp = 0; for (int Add = key/2; Add >0; Add/=2) { for (int i = Add; i < key; i++)//对按步长分的组 进行排序 { for (int m = i-Add; (m>=0) && (data[m] >data[m+Add]); m-=Add) { temp = data[m]; data[m] =data[m+Add]; data[m+Add] = temp; } } } } int _tmain(int argc, _TCHAR* argv[]) { int array[10]={4,10,9,8,7,6,5,4,3,2}; for (int i = 0; i < 10; i++) { cout<<array[i]<<" "; } cout<<endl; insert(array,10); for (int i = 0; i < 10; i++) { cout<<array[i]<<" "; } while (true) { } return 0; }
PS:实例代码在VS2010上验证通过