1.冒泡排序
思想:从第一个元素开始,两两比较相邻元素a1,a2,当a1>a2时,交换顺序,比较下一组元素,循环操作,直到整个数组有序。
优点:稳定
缺点:效率低
代码实现:
void bubble_sort(int* arr,int len)
{
if(arr == NULL || len < 0)
return ;
bool flag = true;
for(int i=0;i<len-1 && flag;i++)
{
flag = false;
for(int j=0;j<len-i-1;j++)
{
if(arr[j] > arr[j+1])
{
flag = true;
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
2.快速排序
思想:首先确定基准点的值,目地是将基准点防止到指定位置,使得左边数据小于基准点,右边数据大于基准点,随后进行左右子串的递归排序,直到整个数组有序。
算法解读:选取中间变量暂存基准点的值,指定i,j两个指针,i指针从后向前遍历,直到找到比基准点小的数据后停下,用该数据的值覆盖基准点位置上的值,随后j指针从前向后遍历,直到找到比基准点大的数据后停下,用该数据的值覆盖i指针位置上的值,重复i,j指针的遍历,直到i=j,用基准点上的值覆盖该位置上的值,完成一次基准点位置的确认,然后进行左右子串的递归遍历,直到整个数组有序。
ps:动图所展示的在找到基准点后子串的排序算法与常见快排略有不同,代码实现以上述提到的思想为主,动图仅供参考。
优点:数据移动少
缺点:不稳定
代码实现:
#include <stdio.h>
void sort(int a[], int left, int right) {
if(left >= right)//如果left大于或者等于right就代表已经整理完成一个部分了
{ return;}
int i = left;
int j = right;
int key = a[left];//选取基准点
while(i < j)//当i和j"相遇"的时候,说明所有元素都被比较了一遍,这时候就不用再循环
{
while(i < j && key <= a[j]) {
j--;//向前寻找 }
a[i] = a[j];//数值覆盖
while(i < j && key >= a[i]) {
i++;//向后寻找}
a[j] = a[i];//数值覆盖
}
a[i] = key;//确定基准点位置
sort(a, left, i - 1);//对左子串进行递归排序
sort(a, i + 1, right);//对右子串进行递归排序
}
void main() {
int a[]={5,6,1,4,9,2,9};
int i;
int length=sizeof(a)/sizeof(int);
sort(a,0,length-1);
for(i=0;i<length;i++){
printf("%d\t",a[i]);}
printf("\n");
}
3.二者复杂度比较