简单排序算法之选择排序、直接插入排序和冒泡排序
简单排序包括简单选择排序、直接插入排序和冒泡排序。时间负责度均为O(n2).
1、 简单选择排序(Selection sort)——不稳定
基本思想:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
Template<class T>
void SelectSort(T A[], int n)
{
int min,temp;
for(int i=0;i<n-1;i++)
min=I;
for(int j=i+1;j<n;j++)
{if(A[j]<A[min]) min=j;}
If(min!=i)
{
temp=A[i];
A[i]=A[min];
A[min]=temp;
}
}
2、 直接插入排序(Insert sort)——稳定
基本思想:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。
void Insertsort2(int a[], int n)
{
int i, j;
for (i = 1; i < n; i++)
if (a[i] < a[i - 1])
{
int temp = a[i];
for (j = i - 1; j >= 0 && a[j] > temp; j--)
a[j + 1] = a[j];
a[j + 1] = temp;
}
}
这里进行了一下改写,将搜索和数据后移这二个步骤合并。即每次a[i]先和前面一个数据a[i-1]比较,如果a[i] > a[i-1]说明a[0…i]也是有序的,无须调整。否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]<a[i]时停止并将temp放到a[j + 1]处。
这样更便于理解,也更高效。
2、 冒泡排序(Insert sort)——稳定
基本思想:它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!
void BubbleSort1(int a[], int n)
{
int i, j;
for (i = n-1; i >0; i--)
for (j = 0; j < i; j++)
if (a[j] > a[j+1])
Swap(a[j], a[j+1]);
}
改进的冒泡排序可以用flag标记是否产生了交换
void bubbleSort2(int* a, int n)
{
int i,j,tmp;
int flag; // 标记
for (i=n-1; i>0; i--)
{
flag = 0; // 初始化标记为0
// 将a[0...i]中最大的数据放在末尾
for (j=0; j<i; j++)
{
if (a[j] > a[j+1])
{
// 交换a[j]和a[j+1]
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag = 1; // 若发生交换,则设标记为1
}
}
if (flag==0)
break; // 若没发生交换,则说明数列已有序。
}
}
程序员面试精选 文章被收录于专栏
本专栏主要整理记录后端程序员面试过程中常见的基础知识点,包括数据结构,操作系统,计算机网络,数据库和各种中间件等。同时会整理大厂面经和面试技巧等文章。