C语言——常见排序算法

数组排序算法

1、选择排序法(由小到大)

思想:①:用第一个数字与剩余数字中最小的数字进行互换位置

  ②:用第二个数字与剩余数字中最小的数字进行互换位置

....................

依次类推,每次都将下一个数字与剩余数字中最小的数字进行位置互换,直至排序结束

#include

#define num 3

int main(){
   int temp;
    int a[num];
    for(int i = 0; i < num; i++){
        scanf("%d",&a[i]);
    }
    for(int i = 0; i < num; i++){
        for(int j = i; j < num; j++){
            if(a[i]>a[j]){
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }

    for(int i = 0; i < num; i++){
       printf("%d\t",a[i]);
    }

    return 0;
}

2、冒泡排序法

核心思想:每次比较数组中相邻两个数组元素的值

①将最小的数字移动到第一个位置,其余数字向后移动一位;

②将剩余数字中最小的移动到第二个位置,其余数字向后移动一位

......................

每次都将剩余数字中的最小数字移动到当前剩余数字的最前方,直到将一组数字从小到大排序为止。

#include

#define num 5

int main(){

    int a[num];
    int temp;

    for(int i = 0; i < num; i++){
        scanf("%d",&a[i]);
    }

    for(int i = 0; i < num; i++){
        for(int j = num; j > i;j--){
            if(a[j] < a[j-1]){
                temp = a[j];
                a[j] = a[j-1];
                a[j-1] = temp;
            }
        }
    }
    for(int i = 0; i < num; i++){
        printf("%d  ",a[i]);
    }

    return 0;

}

 

3、交换排序法

核心:每一位数与后面的所有数一一比较,将小(大)的放在前面,并用所得的小(大)的数对本轮比较中未比较的数进行比较,将比较的最小(大)的数放在最前面,依次往复,直至最终排序完成

Example:9 6 15 4 2

①比较9和6,9大于6,交换位置,6称为第一个数字,(6 9 15 4 2)

②6小于15,6继续和4比较,4小于6,4和6交换位置(4 9 15 6 2)

③4和2比较,2小于4,4和2换位置(2 9 15 6 4)

...........................

按照相同的方式进行比较,从当前第二个数字9开始,继续和后面的数字进行比较,如果遇到比当前数字小的则交换位置,否则继续比较。

#include 
#include 

#define num 5

int main()
{
    int temp,i,j;
    int a[num];

    for(i = 0; i < num; i++){
        scanf("%d",&a[i]);
    }

    for(i = 0; i < num-1; i++){
        for(j = i+1; j < num;j++){
            if(a[i] > a[j]){
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
           }
        }
    }
    for(i = 0; i < num; i++){
        printf("%d  ",a[i]);
    }
    return 0;
}

4、插入排序法

抽出一个数,将该数与前面的所有数进行比较。将其插入到比它大的数前面

#include

int main(){
    int i;
    int temp;
    int a[5];
    for(i=0; i<5;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<5;i++){
        t=a[i]; //要插入的值
        temp=i-1;
        while(temp>=0 && t

5、折半排序法

取中间元素,分为左半边和右半边,分别从两边开始找,左边找大于中间元素的数,找到后记录下标,右边找小于中间元素的数,找到后记录下标,左右找到一组值后,交换两个数的位置。多次递归比较,得出最终顺序。

#include
int main(){
    int i;

    int a[5];
    for(i=0;i<5;i++){
        scanf("%d",&a[i]);
    }
   void compare(int left,int right,int a[]);
    compare(0,4,a);
  for(i=0;i<5;i++){
           printf("%d\t",a[i]);
    }
    return 0;
}


void compare(int left,int right,int a[]){
   int i,j;
    int middle,temp;
    i=left;
    j=right;
    middle=a[(left+right)/2];

    do{
        while((a[i]middle) && (j>left))    j--;    //从右向左找小于中指的数,得到小标j

        if(i<=j){
            //将找打的数交换位置
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            i++;        //继续返回循环找下一组
            j--;
        }
    }while(i<=j);

    if(lefti) compare(i,right,a); //递归右半边
}

排序算法的比较

选择排序法

选择排序法在排序的过程中需要进行n(n-1)/2此比较,互相交换n-1次。简单易实现,适用于数量较小的排序

冒泡排序法

最好的情况是正序,只需要比较n-1次,最差的情况是逆序,需要比较n²次,相对稳定,排序列有序时效果较好

交换排序法

正序最快,逆序最慢,排序列有序时效果较好

插入排序法

需要经过n-1次插入,如果数据恰好在应该插入序列的最末端,则不需要移动,排序列有序时效果较好

折半排序法

对于较大的n,折半排序法是速度最快的排序算法。n较小时,此方法较慢。

你可能感兴趣的:(C语言,c语言)