Fork me on GitHub

几种常见的排序算法

插入排序

算法思想:从1开始,往后比较,比它小的就替换

实现如下:

//
//  main.c
//  insert
//
//  Created by 南瓜不说话 on 2017/9/21.
//  Copyright © 2017年 南瓜不说话. All rights reserved.
//

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void sort(int *p){
    int j;
    int tmp;
    for(int i = 1;i < 100;i++){
        j = i-1;
        tmp = p[i];
        while(p[j] > tmp && j>=0){
            p[j+1] = p[j];
            j--;
        }
        p[j+1] = tmp;
    }
}

int main(int argc, const char * argv[]) {
    srand((int)time(0));
    int ar[100];
    for (int i = 0;i < 100;i++){
        ar[i] = (int)(rand()%100);
    }
    int *p = ar;
    sort(p);
    for(int i = 0;i < 100;i++){
        printf(" %d",p[i]);
    }
    printf("\n");
    return 0;
}

 

快速排序

算法思想:取一个值,比它小的交换到它左边,比它大的交换到它右边

代码实现如下:

  3 //
  5 //  main.c
  7 //  quit
  9 //
 11 //  Created by 南瓜不说话 on 2017/9/21.
 13 //  Copyright © 2017年 南瓜不说话. All rights reserved.
 15 //
 19 #include <stdio.h>
 20 
 21 #include <stdlib.h>
 23 #include<time.h>

 31 void sort(int min,int max,int *arr){
 33     int j=max;
 35     int i=min;
 37     int flag=arr[min];
 39     if(min>=max){
 41         return ;
 43     }
 45     while (i<j) {
 47         while (i<j && arr[j]>=flag) {
 49             j--;
 51         }
 53         arr[i]=arr[j];
 55         while (i<j && arr[i]<=flag) {
 57             i++;
 59         }
 61         arr[j]=arr[i];
 63     }
 65     arr[i]=flag;
 67     printf(" %d\n",min);
 69     sort(min,i-1,arr);
 71     sort(i+1,max,arr);
 75 }
 79 int main(){
 81     srand((int)time(0));
 83     int ar[100];
 85     for (int i=0;i<100;i++){
 87         ar[i]=(int)(rand()%100);
 89     }
 91     int length=sizeof(ar)/sizeof(ar[0]);
 93     int *p=ar;
 95         sort(0,length,p);
 97         for(int i=0;i<100;i++){
 99             printf(" %d",p[i]);
101         }
103     printf("\n");
105     return 0;
107 }
108 

 归并排序:

归并排序思路第一遍看的时候没看懂,不明白怎么合并的,然后网上看了下别人写的代码,豁然开朗。

算法思想:

 1.递归拆分数组 

    递归将数组平分成二等分,一直拆分到单个元素

 2.递归合并数组

    将数据递归合并,合并之前的数组是一个有序数组

//
//  main.c
//  merge
//
//  Created by 南瓜不说话 on 2017/9/22.
//  Copyright © 2017年 南瓜不说话. All rights reserved.
//

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void merge(int *p,int *t,int min,int middle,int max){
    int i =min;
    int j=middle+1;
    int k=min;
    while (i<middle+1&&j<max+1) {
        if(p[i]>p[j])
        t[k++] = p[j++];
        else
            t[k++]=p[i++];
    }
    while (i<middle+1) {
        t[k++]=p[i++];
    }
    while (j<max+1) {
        t[k++]=p[j++];
    }
    for (i=min; i<k; i++) {
        p[i]=t[i];
    }
}

void mergeSort(int *p,int *t,int min,int max){
    if(min<max){
        int middle=(max+min)/2;
        mergeSort(p, t,min, middle);
        mergeSort(p,t, middle+1, max);
        merge(p,t,min,middle,max);
    }
}

int main(int argc, const char * argv[]) {
    srand((int)time(0));
    int arr[100];
    for (int i = 0;i < 100;i++){
        arr[i] = (int)(rand()%100);
    }
    int tmp[100];
    int *t = tmp;
    int *p = arr;
    mergeSort(p,t,0,99);
    for(int i=0;i<100;i++){
        printf(" %d",p[i]);
    }
}

 

posted @ 2017-09-21 15:43  devass  阅读(257)  评论(0编辑  收藏  举报