排序

排序


//(对于排序的代码实现后来我会慢慢加上的,现将思想了解到,然后慢慢写代码,并调试)
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的序列调整为“有序”的序列。一般常用的排序有快速排序,希尔排序,箱式排序,堆排序,直接选择排序,基数排序,冒泡排序,归并排序;
快序排序;

原理:首先在序列中寻找一个做为标准的值,然后以它为标准,将小的排在它的左边,大的排在他的右边,然后再将左右两边的分别再次分成两个部分,以标准为分界限重复原来的操作,然后继续,直到左右最多分别只有一个数的时候停止重复,这样就将序列按照了从小到大的顺序排列了。当然,要达到从大到小的顺序也是一样的原理进行操作。

代码:

#include<stdio.h>
void sort(int *a, int left, int right)
{
    if(left >= right)
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];

    while(i < j)                             
    {
while(i < j && key <= a[j]){
            j--;
        }
        a[i] = a[j];
        while(i < j && key >= a[i]){
            i++;
        }
        a[j] = a[i];
    }
    a[i] = key;
    sort(a, left, i - 1);
    sort(a, i + 1, right);
}


void print(int a[]){
for(int i = 0; i < 8; i++){
printf("%d ",a[i]);
}
printf("\n");
}
int main(){
int a[8] = {10, 20, 14, 61, 81, 41, 23, 41};
print(a);
sort(a, 0, 8);
print(a);
return 0;
}


直接选择排序;

原理:在序列中选择最小的数将他按顺序和前面的数交换,以达到从小到大的效果;

代码:

#include<stdio.h>
void print(int a[]){
for(int i = 0; i < 8; i++){
printf("%d ", a[i]);
}
printf("\n");
}


void play(int a[]){
int k, min;
for(int i = 0; i < 8; i++){
min = 10000;
for(int j = i; j < 8; j++){
if(a[j] < min){
min = a[j];
k = j;
}
}
a[k] = a[i];
a[i] = min;
}
}


int main(){
int a[8] = {10, 20, 14, 61, 81, 41, 23, 41};
print(a);
play(a);
print(a);
return 0;
}

希尔排序;
原理:这是一个在选择排序的基础上进行了优化的结果,先将序列分成几个组,像这样a[0],a[d],a[2d],,,然后a[1],a[1+d],a[1+2d],,,……然后每组分别进行选择排序,排序完成后,就将当前的序列再次分组,现在的d'<d,继续刚才的操作,知道d = 1;结束;此时序列有序;
箱式排序;
原理:箱式排序是先定义一个数组a[m],m的值大于数组的最大值。这样将数组下标作为信息进行排序,当然过程中可能会出现相同的数,所以建议a[i]为一个链式队列,用于保存相同的数,同时还能够先进先出,是的排序稳定;放进数组这个箱子后,按照序号进行读取,排序就成功了;
基数排序:
原理:基数排序是从个位开始向高位进行的排序,当然其本质还是其它排序的应用;例如13,21,36,51,25,42,65第一次排序就是:21,51,42,13,65,36,此时的个位是有序的,然后增加一位,13,21,36,42,51,65,按顺序来,按照数字顺序来进行接数字;最后排序成功;
冒泡排序;

原理:就是将相邻的两个元素进行比较,按照一定条件进行交换,这样使得某些元素像是气泡一样向上冒,称为冒泡排序法;

代码:

#include<stdio.h>
void print(int a[]){
for(int i = 0; i < 8; i++){
printf("%d ", a[i]);
}
printf("\n");
}


void play(int a[]){
for(int i = 0; i < 8; i++){
for(int j = i; j < 7; j++){
if(a[j] > a[j+1]){
int t;
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}


int main(){
int a[8] = {10, 20, 14, 61, 81, 41, 23, 41};
print(a);
play(a);
print(a);
return 0;
}

归并排序法;
原理:归并排序是一种排序后合并在排序的操作思想,用一个例子来说明:1,65,24,15,98,32,10;->{1,65},{15,24},{32,98},{10}->{1,15,24,65},{10,32,98};->{1,10,15,24,32,65,98}排序成功,这就是归并排序的思想;
//(文中的堆排序暂时留下问题)





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值