貌似需要整理一下排序算法了,正好最近在看的宋劲杉的《LINUX一站式编程》也提到了几个排序算法,于是决定把几个常见的排序算法都写写吧。
插入排序的过程就是玩儿扑克牌时整理手牌的过程,不断地从右侧选取一张牌,然后把它和左边已经排序的牌做逐一比较,插入到合适的位置。
下面两个函数用来依次打印数组。功能一样,参数不一样,这是为了方便不同的数据类型的调用。
void print_num_1(uint32_t* arr, uint32_t len){
for(int i=0;i<len;i++)
std::cout<<arr[i]<<"\t";
std::cout<<std::endl;
return;
}
void print_num_2(int* arr, int len){
for(int i=0;i<len;i++)
std::cout<<arr[i]<<"\t";
std::cout<<std::endl;
return;
}
下面是我的啰嗦版本的插入排序
// my version
void insertion_sort_1(uint32_t* arr, uint32_t len){
print_num_1(arr, len);
uint32_t tem_arr[5]={0};
tem_arr[0]=arr[0];
for( int j=1;j<len;j++){
int m=0;
int key=arr[j];
while(m<j && key > arr[m]) {
//while(m<j && key > tem_arr[m]) {
m++;
}
for(int k=j;k>=m+1;k--)
tem_arr[k]=tem_arr[k-1];
tem_arr[m]=arr[j];
std::cout<<"\nj:"<<j<<"\t"<<"m:"<<m<<"\n";
print_num_1(tem_arr, len);
}
for (int n=0;n<len;n++){
arr[n]=tem_arr[n];
}
return;
}
下面是书中的简洁版本的插入排序,看着舒服多了。
//standard version
void insertion_sort_2(uint32_t* arr, uint32_t len){
for ( int j = 1; j < len; j++)
{
int m = j-1;
int key = arr[j];
while( m>=0 && key < arr[m]) {
arr[m+1] = arr[m];
m--;
}
arr[m+1]=key;
std::cout<<"\nj:"<<j<<"\t"<<"m:"<<m<<"\n";
print_num_1(arr, len);
}
return;
}
下面是main函数
int main()
{
int unsorted_arr[10]={10,7,9,6,8,4,11,15,1,5};
print_num_2(unsorted_arr,10);
//insertion_sort_1(unsorted_arr, 10);
insertion_sort_2(unsorted_arr, 10);
print_num_2(unsorted_arr,10);
return 0;
}