#include<stdio.h>
//冒泡排序 其实就是连续的两个值进行比较和互换
void mao_pao1(int data[],int n)
{
int t;
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n-1 ; j++)
{
if ( data[j] > data[j+1] )
{
t = data[j+1];
data[j+1] = data[j];
data[j] = t;
}
}
}
}
//精简冒泡排序
void mao_pao2(int data[],int n)
{
int t,sign;
for(int i = 0 ; i < n ; i++)
{
//1 可能再循环没结束的时候 就已经有序了
//2 因为我们每次循环之后最大的数就被排到最后去了 从最后一个位置依次往前就是元数据的从大到小的顺序排列 所以每次循环就可以在全一次的循环次数基础上减去1
for(int j = 0; j < n-i-1 ;j++)
{
sign = 0;
if ( data[j] > data[j+1] )
{
t = data[j+1];
data[j+1] = data[j];
data[j] = t;
sign = 1; //如果交换值了(就是还没有彻底有序) 就让sign为1
}
}
if(sign==0) break; //如果没有交换值就直接break; 如果用else他还是会先排序 然后才停止时间复杂度依然没有变 而用这种方法就可以省略一些重复的步骤
}
}
//选择排序 经典理解意思是 每次循环都找出最小的值的索引 然后再互换
void swap_sort1(int data[],int n)
{
int i,j,min,t;
for( i = 0 ; i < n; i++)
{
min = i; //假设第一个数值为最小值
for( j = i+1 ; j < n ; j++)
{
if(data[min] > data[j])
{
min = j; //记录最小值的索引
}
if(data[i] > data[min]) //进行交换
{
t = data[min];
data[min] = data[i];
data[i] = t;
}
}
}
}
//选择排序的变种 这个好理解 意思就是以有序序列的最后一个值作为比较值 与无序序列的所有数相比较 如果无序序列的值比有序序列的值小(升序) 那么就交换
void swap_sort2(int data[],int n)
{
int i,j,t;
for( i = 0 ; i < n ; i++)
{
for( j = i+1 ; j < n; j++)
{
if(data[i]>data[j])
{
t = data[j];
data[j] = data[i];
data[i] = t;
}
}
}
}
//希尔排序 它的意思就把整个数组分成诺干个小块 然后在小块里面以位置一一对应 进行比较
//比如 data=[5,4,7,2,1,6] dk=n/2 则data1=[5,4,7] data2=[2,1,6]
//就是拿5与2 4与1 7与6比较
void xi_er_sort(int data[],int n)
{
int i,t,dk;
//因为当dk=n/2时有时候只是部分有序 写成n/2+1就变有序了
//dk用来控制外循环
for( dk = n/2+1 ; dk > 0 ; dk--)
{
for(i = 0 ; i+dk < n; i++) //看好条件 i+dk < n
{
if(data[i] > data[dk+i])//小部分一一对应
{
t = data[dk+i];
data[dk+i] = data[i];
data[i] = t;
}
}
}
}
int main()
{
int n = 5 ;
int data[n] = {6,2,8,1,4};
xi_er_sort(data,n);
for(int i = 0 ; i < n; i++)
{
printf("%5d",data[i]);
}
return 0;
}