一.插入排序法
1.直接插入法排序,C语言实现。
算法思想:略
int main() {
int A[]={1,9,4,6,8,10,7};
int i,j,la;
la =sizeof(A)/sizeof(A[0]);
for(i=1;i<la;i++){ //从数组下标为1的开始,也即从第二个元素开始,因为初始假设A[0]为有序的子序列
int temp=A[i]; //保存插入元素的临时变量
for(j=i-1;j>=0&&A[j]>temp;j--){ //将要插入的第i个元素与第j个元素比较(即与上一个元素比较大小)
//第i个元素比第j个元素小,则进入循环(即查找插入位置)。(默认是递增序列排序)
A[j+1]=A[j];//将第j个元素至i-1个元素依次后移动一个位置(即将较大的元素后移一个位置)
}
A[j+1]=temp;//将要插入的元素插入j+1的位置(j+1就是需要找的插入位置)。
}
for(int a = 0; a<la;a++){
printf("%d,",A[a]);
}
return 0;
}
2.折半插入排序法,C语言实现
算法思想:略
int main() {
int A[]={15,9,4,6,8,10,11};
int i,j,la,low,high,mid;
la =sizeof(A)/sizeof(A[0]);
for(i=1;i<la;i++){
int temp=A[i]; //保存插入元素的临时变量
low=0; high=i-1; // 确定折半查找范围
while(low<=high){ // 递增有序查找
mid=(low+high)/2; // 寻找中间元素,向下取整
if(A[mid]>temp){
high=mid-1;//中间位置的元素大于第i个位置的元素,则high=mid-1即
//第i个元素会将插入到high+1的位置。
}else{
low=mid+1;//否则移动low后,再此进入while循环。
}
}
for(j=i-1;j>=high+1;j--){//上面确定好位置后,现在移动元素位置,从第high+1个元素到i-1个元素依次序
//往后移动i一位
A[j+1]=A[j];
}
A[high+1]=temp;//最后将第i个元素存储的临时变量值赋予给第high+1个位置,即插入元素
}
for(int a = 0; a<la;a++){
printf("%d,",A[a]);
}
return 0;
}
3.希尔排序
二.交换排序
1.冒泡排序
int main() {
int A[]={10,23,20,2,1};
int i,j,la,temp;
la =sizeof(A)/sizeof(A[0]); //获取数组长度
for(i=0;i<la;i++){ //排序次数为数组长度-1
int flag=0; //排序结束标志位
for(j=la-1;j>i;j--){ //每次排序的比较次数为:数组la-1,循环逐渐递减
if(A[j-1]>A[j]){ //满足条件交换(递增排序)
temp=A[j-1];
A[j-1]=A[j];
A[j]=temp;
flag=1; //交换完成后标志位置1
}
}
if(flag==0){ //若标志位为零,则上一次没有发生交换,说明有序,打印出排序结果,结束排序。
printf("第%d趟排序结果:",i+1);
for(int a = 0; a<la;a++){
printf("%d,",A[a]);
}
printf("\n");
return 0; //结束排序
}
}
}
2.快速排序
三.选择排序
1.简单选择排序
int main() {
int A[]={10,23,20,2,1};
int i,j,la,min,temp;
la =sizeof(A)/sizeof(A[0]);
for(i=0;i<la;i++){
min=i;
for(j=i+1;j<la;j++){
if(A[j]<A[min]){
min=j;
}
}
if(min!=i){
temp=A[i];
A[i]=A[min];
A[min]=temp;
}
printf("第%d趟排序结果:",i+1);
for(int a = 0; a<la;a++){
printf("%d,",A[a]);
}
printf("\n");
}
}
2.堆排序