直接插入排序学习笔记与学习心得
插入排序代码
编写环境
Xcode
使用语言C++
//
// main.cpp
// 直接插入排序
//
// Created by Neil Xie on 2020/3/23.
// Copyright © 2020 Neil Xie. All rights reserved.
//
#include <iostream>
using namespace std;
void print(int a[], int n ){
cout<<n <<":";
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
void InsertSort(int a[], int n)
{
for(int i= 1; i<n; i++){
if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
int j= i-1;
int x = a[i]; //复制为哨兵,即存储待排序元素
a[i] = a[i-1]; //先后移一个元素
while(x < a[j]){ //查找在有序表的插入位置
a[j+1] = a[j];
j--; //元素后移
//printf("j=%d",j);
if (j<=0)
{
break;
}
}
a[j+1] = x; //插入到正确位置
}
print(a,n); //打印每趟排序的结果
}
}
int main(){
int a[9] = {3,1,5,7,2,4,9,6,6};
InsertSort(a,9);
print(a,9);
return 0;
}
代码运行结果如下:
9:1 3 5 7 2 4 9 6 6
9:1 3 5 7 2 4 9 6 6
9:1 3 5 7 2 4 9 6 6
9:1 2 3 5 7 4 9 6 6
9:1 2 3 4 5 7 9 6 6
9:1 2 3 4 5 7 9 6 6
9:1 2 3 4 5 6 7 9 6
9:1 2 3 4 5 6 6 7 9
9:1 2 3 4 5 6 6 7 9
Program ended with exit code: 0
直接插入排序的步骤:
1、建立一个哨兵(即临时变量),将要插入的数据(即要排序的数据)赋给这个临时变量。
2、插入数据从后面开始比较,如果大于前面,就记录下标,并将数据后移,直到插入数据碰到比他小的。
3、将临时变量赋值给当前记录下标。
4、用循环语句完成全部数据的插入。
代码的部分解读
void print(int a[], int n ){
cout<<n <<":";
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
定义了一个函数:
作用是每次排序之后,都将本次排序后的结果打印出来,使排序的过程清晰明了。
void InsertSort(int a[], int n)
{
for(int i= 1; i<n; i++){
if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入
int j= i-1;
int x = a[i]; //复制为哨兵,即存储待排序元素
a[i] = a[i-1]; //先后移一个元素
while(x < a[j]){ //查找在有序表的插入位置
a[j+1] = a[j];
j--; //元素后移
//printf("j=%d",j);
if (j<=0)
{
break;
}
}
a[j+1] = x; //插入到正确位置
}
print(a,n); //打印每趟排序的结果
}
}
这个部分是直接插入排序的核心内容:
1、首先使用循环,将需要排序的数值全部过一遍。
扫描二维码关注公众号,回复: 11114251 查看本文章 2、使用比较语句,从最后开始排序,如果前面的数小于标兵中的数,则直接插入;如果前面的数大于标兵中的数,则记录其下标,并将其后移一位。
3、打印每次排序的结果。
其他插入排序的做法
代码如下:
#include<iostream>
#include<cstdlib>
using namespace std;
//交换数组元素位置位置
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
/*
插入排序。注意,若后面一个元素比其前面一个元素小,则将这两个元素交换位置,然后再来比较这个插入元素与前面一个元素的大小,若小,则还需要交换这两个元素位置,一直到这个插入元素在正确的位置为止
*/
void insertSort(int a[], int length)
{
for (int i = 1; i < length; i++)
{
for (int j = i - 1; j >= 0 && a[j + 1] < a[j]; j--)
{
swap(a[j], a[j + 1]);
}
}
}
int main()
{
int a[] = { 2,1,4,5,3,8,7,9,0,6 };
insertSort(a, 10);
for (int i = 0; i < 10; i++)
{
cout << a[i] << "";
}
cout << endl;
system("pause");
return 0;
}
代码核心思想:
使用一个交换前后顺序的函数,在一个数组中,重复使用该函数多次,直至完成排序。