默认均为从小到大排序
常用函数:
void Swap(int& a,int& b)
{
int temp = a;
a = b;
b = temp;
}
1.冒泡排序
思想:如水中的泡泡一般,每此排序均将一个最大值冒出
code:
void BubbleSort(int a[],int n)
{
int i,j;
for(i = 0 ; i < n ; ++i)
for(j = 1 ; j < n - i ; ++j)
{
if(a[j-1]>a[j])
Swap(a[j],a[j-1]);
}
}
优化:通过设置flag,当从某趟开始未发生交换后,表明排序完成。
code:
void BubbleSort(int a[],int n)
{
int i,len = n;
bool flag = true;
while(flag)
{
flag = false;
for(i = 1 ; i < len ; ++i)
{
if(a[i]<a[i-1])
Swap(a[i],a[i-1]);
flag = true;
}
--len;
}
}
2.直接插入排序
思想:从数组第二个元素开始,依次按排序规则将其插入至之前的适当位置
code:
void InsertSort(int a[],int n)
{
int i,j,k;
for(i = 1 ; i < n ; ++i)
{
int temp = a[i];
for(j = i - 1 ; j >= 0 ; --j)
if(a[j] < temp)
break;
for(k = i - 1; k > j ; --k)
a[k+1] = a[k];
a[k+1] = temp;
}
}
优化:在查找插入过程的同时执行交换,当找到该位置时,即完成了该次排序
code:
void InsertSort(int a[],int n)
{
int i,j;
for(i = 1 ; i < n ; ++i)
for(j = i - 1 ; j >= 0 && a[j] > a[j+1] ; --j)
Swap(a[j],a[j+1]);
}
3.希尔排序
思想:即为分组插入排序。
code:
void ShellSort(int a[],int n)
{
int i,j,k,gap;
for(gap = n/2 ; gap > 0 ; gap /= 2)
{
for(i = 0 ; i < gap ; ++i)
{
for(j = i + gap ; j < n ; j += gap)
{
if(a[j] < a[j-gap])
{
int temp = a[j];
for(k = j - gap; (k >= 0)&&(a[k] > temp) ; k -= gap)
a[k+gap] = a[k];
a[k+gap] = temp;
}
}
}
}
}
优化:思路同直接插入排序,边查询边交换。
code:
void ShellSort(int a[],int n)
{
int i,j,k,gap;
for(gap = n/2 ; gap > 0 ; gap /= 2)
for(i = gap ; i < n ; ++i)
for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
Swap(a[j], a[j + gap]);
}