差别和异同
相同:对于数组类型,这三种排序都是用二重循环去实现的
具体思路:
冒泡:第i次循环,把第i大的数甩到数组末尾
简单选择:第i循环,把第i小的数和下标i的元素交换
直接插入:第i次循环,前面i个数都有序
稳定性差别:
在常见的排序算法里,有五种是不稳定的(不稳定:排序前是 1,1 排序后虽然还是1,1,但是第二个1原先在第一个位置上)
简单选择不稳定,快堆折归(快排、堆排、折半插入、归并排序),后四种的速度都是nlogn,可以认为牺牲了稳定度去换取了速度。但简单选择的不稳定纯粹是因为太简单了,他的时间复杂度是n^2。
代码
int* simpleSort(int* data ,int size) //简单选择
{
//防空
if(NULL == data )
return NULL;
//一次选出一个最小
int minPos=0;
int minVal=0;
int i = 0;
int j = 0;
int temp=0;
for(i;i<size;i++){
for(j=i;j<size;j++)
{
if(j==i)
{
minPos = i;
minVal = data[i];
}
if(data[j] < minVal)
{
minVal = data[j];
minPos = j;
}
}
//把data[i]和data[minPos]交换
temp = data[minPos];
data[minPos] = data[i];
data[i] = temp;
}
return data;
}
//用例:一个任意的数组
int* inputSort(int* data , int size) //int* 输入,int* 返回修改后的
{
if(NULL==data&& size <=0)
return NULL;
//外重用i:表示已经排序完的部分
//内重用j,从0 ->i,找一个合适的位置
int i;int j ;
i = j = 0;
for(i=0;i<size;i++)
{
for(j=0;j<=i;j++)
{
//把 下标 i 插入 0-> i 里
if(j == i )
break;
// j可能溢出吗? 不可能,如果j比前面都大,不动就好了,i不会溢出,j也不会
if(data[i] < data[j])
{
int temp = data[i];
// 原先是 j -> i-1; 变成 j+1 ->i
moveOne(&(data[j]), i-j); //从data[j]开始,i-j个元素 右移一步
data[j]= temp;
break;
}
}
}
}
void* bubbleSort(int* data ,int size ) //传入一个数组,C里面数组就要有大小
{
int sup =0 ; //交换时的辅助变量
for(int i = 0 ; i < size ; i++)
{
for(int j=0; j < size-1; j++)
{
if(data[j] > data[j+1])
{
sup = data[j];
data[j] = data[j+1];
data[j+1] = sup;
}
}
echoAll(data,size);
}
return data;
}