七大排序算法

第一篇技术文章,今天就把七大排序算法记录下来把。

//冒泡排序
#include "stdafx.h"
#include <stdio.h>
#include<malloc.h>
#include<math.h>
void bubbleSort(int n,int a[]) {

    int flag = 1;                                      //这里的flag主要防止这个序列本身是顺序的,一趟比较完还是0,那么就证明这个数列是顺序的,不需要第二趟了
    for (int i = 0; i < n && flag ==1; i++) {
        flag = 0;
        for (int j = 0; j < n - i-1; j++) {
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;

                flag = 1;
            }
        }
    }
}


//选择排序
void selectSort(int n,int a[]) {

    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (a[i] > a[j]) {
                int temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }
}


//直接插入排序
void insertSort(int n,int a[]) {

    int i, j;
    for (i = 1; i < n; i++) {
        int temp = a[i];
        j = i - 1;
        while (temp > a[j] && j >= 0) {
            a[j+1] = a[j--];
        }
        a[j+1] = temp;
    }
}


//快速排序
void swap(int *a, int *b) {

    int temp = *a;
    *a = *b;
    *b = temp;
}

void quickSort(int a[],int s,int t) {
    int i, j;
    if (s < t) {
        i = s;
        j = t+1;

        while (1) {
            do
                i++;
            while (!(a[s] >= a[i] || i == t));
            do
                j--;
            while (!(a[s] <= a[j] || j == s));

            if (i < j) 
                swap(&a[i],&a[j]);
            else
                break;
        }

        swap(&a[s],&a[j]);

        quickSort(a,s,j-1);
        quickSort(a,j+1,t);
    }
}


//希尔排序  其实就是特殊的插入排序,当插入排序的gap=1  就是shell排序  
void shellSort(int a[],int n) {
    
    int gap = n;
    while (gap > 1) {
        gap = gap / 2;

        for (int i = gap; i < n; i++) {
            int temp = a[i];
            int j = i - gap;
            while (temp > a[j] && j >= 0) {
                a[j + gap] = a[j];
                j-=gap;
            }
            a[j + gap] = temp;
        }
    }
}



//堆排序
void swap1(int k[], int i, int j) {
    int temp = k[i];
    k[i] = k[j];
    k[j] = temp;
}

void heapAdjust(int k[], int s, int  n) {
    int i, temp;
    temp = k[s];
    for (i = 2 * s; i <= n; i *= 2) {
        if ( i<n && k[i] < k[i + 1] ) {
            i++;
        }
        if (temp >= k[i]) {
            break;
        }
        k[s] = k[i];
        s = i;
    }
    k[s] = temp;
}

void heapSort(int k[], int n) {
    int i;
    //构建堆,一个大顶堆,或者一个小顶堆
    for (i = n / 2; i > 0; i--) {
        heapAdjust(k, i, n);
    }
    //调整
    for (i = n; i > 1; i--) {
        swap1(k, 1, i);
        //重新构建堆
        heapAdjust(k, 1, i-1);
    }
}


//归并排序(递归实现)
#define MAX_SIZE 11
void mergeing(int *list1, int list1_size, int *list2, int list2_size) {
    
    int i, j, k, m;
    int temp[MAX_SIZE];

    i = j = k = 0;
    while (i < list1_size && j < list2_size) {
        if (list1[i] < list2[j]) {
            temp[k++] = list1[i++];
        }
        else {
            temp[k++] = list2[j++];
        }
    }

    while (i < list1_size) {
        temp[k++] = list1[i++];
    }
    while (j<list2_size){
        temp[k++] = list2[j++];
    }

    for (m = 0; m < list1_size + list2_size; m++ ) {
        list1[m] = temp[m]; 
    }
}

void mergeSort(int k[], int n) {

    if (n > 1) {
        int *list1 = k;
        int list1_size = n / 2;
        int *list2 = k + n / 2;
        int list2_size = n - list1_size;

        mergeSort(list1, list1_size);
        mergeSort(list2, list2_size);

        mergeing(list1, list1_size, list2, list2_size);
    }

}



//归并排序(迭代实现) 
void mergeSort1(int k[], int n) {
    int i, left_min, left_max, right_min, right_max,next;
    int *temp = (int*)malloc(n * sizeof(int));

    for (i = 1; i < n; i *= 2) {    //步长 1,2,4,8,16,第一层1,第二层2,第三层4,。。。
        for (left_min = 0; left_min < n - i; left_min = right_max) {
            right_min = left_max = left_min + i;
            right_max = left_max + i;

            if (right_max > n) {
                right_max = n;
            }

            next = 0;

            while (left_min < left_max && right_min < right_max) {
                if (k[left_min] < k[right_min]) {
                    temp[next++] = k[left_min++];
                }
                else {
                    temp[next++] = k[right_min++];
                } 
            }

            while (left_min < left_max) {
                k[--right_max] = k[--left_max];
            }
            while (next > 0) {
                k[--right_min] = temp[--next];
            }
        }
    }
}

void bitode(int n, int *sum, int *m) {

    char c;
    scanf("%c", &c);
    if (c != '#') {
        *m = *m + 1;
        bitode(n + 1, &(*sum), &(*m));
    }
    if (c == '1')
        *sum = *sum + pow(2, (*m) - n - 1);
}


void main1() {
    
    int sum = 0, m = 0;
    bitode(0, &sum, &m);
    printf("the result is \n %d", sum);
    getchar();

    int a[11] = {333,2,12,43,54,11,65,75,21,34,97};
     
    for (int i = 0; i < 11; i++) {
        printf("%d ", a[i]);
    }

    //bubbleSort(11, a);
     
    //selectSort(11, a);

    //insertSort(11, a);

    //quickSort(a,0,10);

    //shellSort(a, 11);

    //heapSort(a, 10); 

    //mergeSort(a,11);

    mergeSort1(a, 11);

    printf("\n the result is:\n");
    for (int i = 0; i < 11; i++) {
        printf("%d ", a[i]);
    }

    getchar();
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容