c语言不用for排序,C语言十大排序一

计数排序

注意点和使用场景

计数排序只能用于有限数据的排序,并且数字不是非常大的时候

计数排序的条件

1.数组索引必须和排序范围一致,例如如果排序的数字是09,那么数组索引必须为09

2.遍历数组时每次遇到需要排序的数, 就往对应索引的元素中存入原来的值+1

3.输出数据时输出的是数组的索引,索引中存储的时表示是否需要该索引并且输出次数的值

代码如下:

//需求:输入5个0~9的值,按由小到大输出

int num[10] = {0};

int len = sizeof(nums) / sizeof(nums[1]);

int value = -1;

for(int i = 0;i < 5;i++)

{

printf("请输入一个数字\n");

scanf("%i",&value);

num[value] += 1;

}

for(int i = 0;i < len;i++)

{

for(int j = 0;j < num[i];j++)

{

printf("%i ",i);

}

}

选择排序

选择排序的逻辑

1.选择排序是先将第一个元素和后面所有元素比较,如果按由小到大排序输出,那么第一个元素如果比后面的元素小就交换

2.选择排序在经过第一轮比较后最值出现在第一个元素上,如果有n个元素进行排序,那么进行n-1轮比较就产生了最值

//在键盘上输入5个数字,按由小到大输出

//第一轮进行4次比较,第二轮进行3次比较,第三轮进行2次比较,第四轮进行一次比较

//和我们打印图形时打印的倒三角十分相似

int num[5] = {0};

int len = sizeof(nums) / sizeof(nums[1]);

for(n = 0;n < len;n++)

{

printf("请输入一个数字\n");

scanf("%i",&num[n]);

}

//进行比较

for(i = 0;i < len - 1;i++)

{

for(j = i;j < len - 1;j++)

{

if(num[i] > num[j+1])

{

int temp = num[i];

num[i] = num[j+1];

num[j+1] = temp;

}

}

}

//输出

for(int i = 0;i < len;i++)

{

printf("%i ",num[i]);

}

冒泡排序

冒泡排序的逻辑

1.让相邻两个元素进行比较,如果按由小到大输出,那么如果前面一个元素大于后面一个元素就交换

2.经过第一轮比较,最值出现在最后一个元素上,那么需要经过n-1轮比较

代码如下:

//在键盘上输入5个数字,按由小到大输出

//第一轮进行4次比较,第二轮进行3次比较,第三轮进行2次比较,第四轮进行一次比较

//和我们打印图形时打印的倒三角十分相似

int num[5] = {0};

int len = sizeof(num) / sizeof(num[1]);

for(n = 0;n < len;n++)

{

printf("请输入一个数字\n");

scanf("%i",&num[n]);

}

//进行比较

for(i = 0;i < len -1;i++)

{

for(j = 0;j < len - 1 -i;j++)

{

if(num[j] > num[j+1])

{

int temp = num[j]

num[j] = num[j+1];

num[j+1] = temp;

}

}

}

for(int i = 0;i < len;i++)

{

printf("%i ",num[i]);

}

插入排序

插入排序逻辑

1.插入排序从第1个元素开始,依次向前比较,如果按由小到大输出,如果前一个元素比自己打,就交换位置如果比自己小就不交换

2.如果有n个元素,则需要进行n-1次插入比较

代码如下:

//需求:从键盘上输入5个数字,按由小到大输出

//第一轮往前比较一次,第二轮比较两次......

//和我们打印图形输出尖尖朝上的三角形很类似

int num[5] = {0};

int len = sizeof(num) / sizeof(num[1]);

for(int n = 0;n < len;n++)

{

printf("请输入一个数字\n");

scanf("%i",&num[n]);

}

//进行比较

for(int i = 1;i < len;i++){

int j = i;

int temp = num[i];//取出用于比较的元素

while(j > 0){

//j>0意味着需要比较

if(temp < num[j - 1]){

//把num[j-1]这个元素向后挪一位,而后面的元素是num[j]也是temp

num[j] = num[j-1];

}else{

break;

}

j--;

}

//循环结束后 j如果全部比较完,j应该是0,如果未全部比较完就跳出元素,则j应该就是那个num[j]>num[j-1]的j

//这个时候num[j]空缺,未赋值,这个值就应该是用于比较的temp

num[j] = temp;

}

for(int i = 0;i < len;i++)

{

printf("%i ",num[i]);

}

插入排序的第二种方法

注意点:此方法没有第一种方法效率高,交换次数更多

#include

int main()

{

int num[5] = {5,1,3,7,9};

//1.将每个元素和它前面的元素比较,如果按由小到大输出,比较的元素比前面一个元素小则交换否则不交换

//2.一共5个元素要比四次

int len = sizeof(num) / sizeof(num[0]);

for(int i = 1;i < len;i++){

for(int j = i;j > 0;j--){

if(num[j]

int temp = num[j];

num[j] = num[j-1];

num[j-1] = temp;

}

}

}

for(int n = 0;n < len;n++){

printf("num[%i] = %i\n",n,num[n]);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值