跟着米Sir学编程
#include <stdio.h>
#include <stdlib.h>
//初级冒泡排序
void func1(int a[],int n){
int temp=0;
for(int i=0;i<n-1;i++){ //当循环比较n-1次的时候,最后的那个元素已经确定了
for(int j=i+1;j<n;j++){ //按道理来说,第二次循环会少一次,但是第二次循环是要所有元素都要遍历,所以是n-2+1=n-1
if(a[i]>a[j]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
//冒泡排序升级版(关键:元素两两比较;效率有所提升)
void func2(int a[],int n){
int temp = 0;
int flag=1;
for(int i=0;i<n-1&&flag;i++){ //循环n-1次:最后一个元素不用比价;用来存放元素
for(int j=n-1;j>i;j--){ //重最底层开始做循环
flag=0;
if(a[j-1]>a[j]){
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
flag=1; //只要看到flag没有发生变化,就证明已经排好了
}
}
}
}
void main(){
int a[10]={2,5,3,1,7,6,9,0,8,10};
func2(a,10);
for(int i=0;i<10;i++){
printf("%d->",*(a+i));
}
printf("\n");
system("pause");
}
//直接插入排序
#include <stdio.h>
int main(){
int i;
void func2(int arr[],int n);
int a[9]={0,1,5,2,3,7,9,6,4}; //func2中a[0]作为哨兵
func2(a,9);
for(i=1;i<9;i++){
printf("->%d",a[i]);
}
return 0;
}
void func1(int arr[],int n){
int i,j,temp;
for(i=1;i<n;i++){
if(arr[i]<arr[i-1]){ //证明需要移动位置
temp=arr[i];
for(j=i-1;arr[j]>temp;j--){ //依次比较i-1后面的每一个元素,如果>temp,需要向后移动(覆盖);退出该for循环时,前两个数字相等,需要把后一个数字替换成较大的
arr[j+1]=arr[j]; //依次替换
}
arr[j+1]=temp;
}
}
}
void func2(int k[],int n){//如果第一个元素k[0]设为哨兵
//1-n进行比较
for(int i=2;i<n;i++){ //重第二个元素开始插入
//每选取一个元素,都要进行下列插入
if(k[i-1]>k[i]){
k[0]=k[i]; //哨兵保存
k[i] = k[i-1]; //把最大的数弹出去(由于已近是排好序的,所以k[i-1]就是最大的数)
for(int j=i-2;k[j]>k[0];j--)//由于前面已经进行了交换,所以i-2开始
{
//交换覆盖
k[j+1]=k[j];
}
//交换完后
k[j+1]=k[0];
}
}
}
网友评论