选择排序可以分为三种: (1)直接插入排序 (2)二分法插入排序 (3)希尔排序 直接插入排序: /* 时间效率为 O(n^2),对于小数组,插入排序简单易行,对于大数组效率过低,不宜采用。 */ #include<iostream> #include<vector> using namespace std; class InsertSort { private: int len; vector<int> list; public: InsertSort(vector<int>m_list,int m_len); void Insert_Sort(); void PintOut(); }; InsertSort::InsertSort(vector<int>m_list,int m_len) { len=m_len; for(int i=0;i<len;i++) { list.push_back(m_list[i]); } } void InsertSort::Insert_Sort() { int j=0; int temp; for(int i=1;i<len;i++) { j=i; temp=list[j]; while(j>0&&temp<list[j-1]) //与前面数进行比较 { list[j]=list[j-1]; //前移 j--; } list[j]=temp; //找到合适的位置 } } void InsertSort::PintOut() { /*for(int i=0;i<len;i++) { cout<<list[i]<<endl; }*/ vector<int>::iterator it; for(it=list.begin();it!=list.end();it++) { cout<<*it<<endl; } } int main() { vector<int> list; list.push_back(1); list.push_back(5); list.push_back(7); list.push_back(3); list.push_back(8); list.push_back(2); list.push_back(4); list.push_back(6); InsertSort is(list,list.size()); is.Insert_Sort(); is.PintOut(); } 二分法插入排序: #include<iostream> #include<vector> using namespace std; class BinaryInsertSort { private: int len; vector<int> list; public: BinaryInsertSort(vector<int> m_list,int m_len); void binaryinsertsort(); void out(); }; BinaryInsertSort::BinaryInsertSort(vector<int> m_list, int m_len) { len=m_len; for(int i=0;i<len;i++) { list.push_back(m_list[i]); } } void BinaryInsertSort::binaryinsertsort() { int middle; for(int i=0;i<len;i++) { int insertNum=list[i]; int left=0; int right=i-1; while(left<=right) { middle=(right+left)/2; if(insertNum>list[middle]) left=middle+1; else right=middle-1; } for(int j=i;j>left;j--) list[j]=list[j-1]; list[left]=insertNum; } } void BinaryInsertSort::out() { for(int i=0;i<len;i++) { cout<<list[i]<<endl; } } int main() { vector<int> list; list.push_back(1); list.push_back(5); list.push_back(7); list.push_back(3); list.push_back(8); list.push_back(2); list.push_back(4); list.push_back(6); BinaryInsertSort bis(list,list.size()); bis.binaryinsertsort(); bis.out(); } 希尔排序: #include<iostream> #include<vector> using namespace std; class ShellSort { private: int len; vector<int> list; public: ShellSort(vector<int>m_list,int m_len); void Shell_Sort(); void PintOut(); }; ShellSort::ShellSort(std::vector<int> m_list, int m_len) { len=m_len; for(int i=0;i<len;i++) { list.push_back(m_list[i]); } } void ShellSort::Shell_Sort() { int insertNum; int gap=len/2; while(gap) { for(int i=gap;i<len;i++) { insertNum=list[i]; int j=i; while(j>=gap&&insertNum<list[j-gap]) { list[j]=list[j-gap]; j-=gap; } list[j]=insertNum; } gap=gap/2; } } void ShellSort::PintOut() { vector<int>::iterator it; for(it=list.begin();it!=list.end();it++) { cout<<*it<<endl; } } int main() { vector<int> list; list.push_back(20); list.push_back(37); list.push_back(50); list.push_back(35); list.push_back(10); list.push_back(1); ShellSort ss(list,list.size()); ss.Shell_Sort(); ss.PintOut(); }