int n = 10;
int a[10] = {1,5,3,4,8,7,10,9};
说明: 以下算法均为从小到大排序为例,为方便,只显示必要的代码;
一、冒泡排序
基本思想:进行 n-1 次(最坏的情况为全部倒序,此时需要遍历 n-1 次即最多次)遍历要排序的数组,每一次遍历依次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。
int main()
{
IO
for(int cnt = 1; cnt < n; cnt++)//遍历的次数
{
for(int i = 0; i < n-1; i++)
{
if(a[i] > a[i+1])//相邻元素顺序相反
{
swap(a[i], a[i+1]);//交换
}
}
}
for(int i = 0; i < n-1; i++) cout<<a[i]<<" "; cout<<a[n-1]<<endl;
return 0;
}
二、快速排序
基本思想:
1、对冒泡排序的优化,选取一个基准数;
2、将待排序的元素进行分区,比基准数大的放在右边,比基准数小的放在左边;
3、对左右两个分区重复以上步骤直到所有的元素都是有序的;
int i,j,cnt,n = 10,a[10] = {1,5,3,4,2,8,6,7,10,9};
void quick_sort(int l, int r)
{
int ll = l,rr = r;
if(l < r)//保证至少有两个数参与排序
{
int base = a[l];
while(l < r)
{
//找到比基准数小或者相等的数放在基准数的左边
while(r > l && a[r] >= base) r--;//从右向左扫描,如果 a[r] 大于基准数就向左移动
a[l] = a[r];//否则就将当前的值赋值给 l 指针指向的位置
//找到比基准数大的数或者相等放在基准数的右边
while(l < r && a[l] <= base) l++;//从左向右扫描,如果 a[l] 小于基准数就向右移动
a[r] = a[l];//否则就将当前的值付给 r 指针指向的位置
}
a[r] = base;//基准数归位
quick_sort(ll, l-1);//对基准数左边的数进行递归排序
quick_sort(r+1, rr);//对基准数右边的数进行递归排序
}
}
int main()
{
IO
quick_sort(0, n-1);
for(i = 0; i < n-1; i++) cout<<a[i]<<" "; cout<<a[n-1]<<endl;
return 0;
}
三、选择排序
基本思想:每次在未排序的元素中,找到最小的数,放在已排序元素的末尾,直到整个序列有序。最多进行 n-1 次(最坏的情况,全部逆序)排序,第 i 次寻找到的数与 a[i] 进行交换。
int main()
{
IO
for(int cnt = 0; cnt < n-1; cnt++)//n-1 次排序
{
int index = cnt;
for(int i = cnt+1; i < n; i++)
{
if(a[i] < a[index])
index = i;
}
swap(a[cnt], a[index]);
}
for(int i = 0; i < n-1; i++) cout<<a[i]<<" "; cout<<a[n-1]<<endl;
return 0;
}
四、归并排序
基本思想: