1.直接插入排序
思路:从i开始遍历,i之前为已经排序好的数组,从0至i-1遍历,如果遇到比i小的数字,就交换
代码:
#include<iostream>
using namespace std;
class List{
public:
List(){
array=NULL;
}
void creat(){
int n;
cout<<"请输入数组大小:";
cin>>n;
this->n=n;
array=new int[n];
for(int i=0;i<n;i++){
cin>>array[i];
}
}
void print(){
for(int i=0;i<n;i++){
cout<<array[i]<<" ";
}
cout<<endl;
}
void sort(){
for(int i=1;i<n;i++){
int key=array[i];
int j=i-1;
while(array[j]>key&&j>=0){
array[j+1]=array[j];
j--;
}
array[j+1]=key;
}
}
private:
int *array;
int n;
};
int main(){
List l;
l.creat();
l.sort();
l.print();
}
2.折半插入排序
思路:查找方法改为折半查找法,关键是找到该插入的下标。
代码:
#include<iostream>
using namespace std;
class List{
public:
List(){
array=NULL;
}
void creat(){
int n;
cout<<"请输入数组大小:";
cin>>n;
this->n=n;
array=new int[n];
for(int i=0;i<n;i++){
cin>>array[i];
}
}
void print(){
for(int i=0;i<n;i++){
cout<<array[i]<<" ";
}
cout<<endl;
}
void sort(){
for(int i=1;i<n-1;i++){
int lo=0;
int hi=i-1;
int key=array[i];
while(lo<=hi){
int mid=(lo+hi)/2;
if(array[mid]>key){
hi=mid-1;
}
else{
lo=mid+1;
}
}
for(int j=i;j>hi+1;j--){
array[j]=array[j-1];
}
array[hi+1]=key;
}
}
private:
int *array;
int n;
};
int main(){
List l;
l.creat();
l.sort();
l.print();
}
3.二路插入排序
思路:设置两个指针first,final,每个数和数组第一个数比较
代码:
#include<iostream>
using namespace std;
class List{
public:
List(){
array=NULL;
first=final=0;
}
void creat(){
cout<<"请输入数组大小:";
cin>>n;
array=new int[n];
for(int i=0;i<n;i++){
cin>>array[i];
}
}
void print(){
for(int i=0;i<n;i++){
cout<<array[i]<<" ";
}
cout<<endl;
}
void print2(){
int i=first;
int m=n;
while(m--){
cout<<array[i++]<<" ";
if(i==(n)){
i=0;
}
}
}
void sort(){
int *newarray=new int[n];
newarray[0]=array[0];
for(int i=1;i<n;i++){
int key=array[i];
if(key>=array[0]){
int lo=0;
int hi=final;
while(lo<=hi){
int mid=(lo+hi)/2;
if(newarray[mid]>key){
hi=mid-1;
}
else{
lo=mid+1;
}
}
for(int j=final+1;j>hi+1;j--){
newarray[j]=array[j-1];
}
newarray[hi+1]=key;
final++;
}
else{
if(first==0){
newarray[n-1]=key;
first=n-1;
}
else{
int lo=first;
int hi=n-1;
while(lo<=hi){
int mid=(lo+hi)/2;
if(newarray[mid]>key){
hi=mid-1;
}
else{
lo=mid+1;
}
}
for(int j=first-1;j<hi;j++){
newarray[j]=newarray[j+1];
}
newarray[hi]=key;
first--;
}
}
}
array=newarray;
}
public:
int *array;
int n;
int first;
int final;
};
int main(){
List l;
l.creat();
l.sort();
l.print();
l.print2();
}
4.表插入排序
思路:每个结点都有有一个next用来存储下一个比它大的数字的下标,最后再重新排序
代码:
#include<iostream>
using namespace std;
class Node{
public:
int data;
int next;
};
class List{
public:
List(){
array=NULL;
}
void creat(){
int n;
cout<<"请输入数组大小:";
cin>>n;
this->n=n;
array=new Node[n+1];
for(int i=1;i<=n;i++){
cin>>array[i].data;
}
}
void print(){
for(int i=1;i<=n;i++){
cout<<array[i].data<<" ";
}
cout<<endl;
}
void sort(){
array[0].next=1;
array[0].data=100000;
array[1].next=0;
for(int i=2;i<=n;i++){
int q=0;
int p=array[0].next;
while(1){
if(array[p].data>array[i].data){
array[q].next=i;
array[i].next=p;
break;
}
else{
q=p;
p=array[p].next;
}
}
}
int q=0;
int p=array[0].next;
for(int i=1;i<n;i++){
while(p<i){
p=array[p].next;
}
q=array[p].next;
int t1=array[i].data;
int t2=array[i].next;
array[i].data=array[p].data;
array[i].next=p;
array[p].data=t1;
array[p].next=t2;
p=q;
}
}
private:
Node *array;;
int n;
};
int main(){
List l;
l.creat();
l.sort();
l.print();
}
5.希尔排序
代码:
#include<iostream>
using namespace std;
class List{
public:
List(){
array=NULL;
}
void creat(){
int n;
cout<<"请输入数组大小:";
cin>>n;
this->n=n;
array=new int[n];
for(int i=0;i<n;i++){
cin>>array[i];
}
}
void print(){
for(int i=0;i<n;i++){
cout<<array[i]<<" ";
}
cout<<endl;
}
void sort(){
int m=n/2;
while(m){
for(int i=m;i<n;i++){
int j=i-m;
int key=array[i];
while(j>=0&&array[j]>key){
array[j+m]=array[j];
j=j-m;
}
array[j+m]=key;
}
m=m/2;
}
}
private:
int *array;
int n;
int first;
int final;
};
int main(){
List l;
l.creat();
l.sort();
l.print();
}