各种排序算法

#include <iostream>
#include <cstdio>
#include <cstring>
#define mid(x) x >> 1;
using namespace std;

const int M = 105;
int num[M];
int n;

void insertion_sort(int h){

    int temp, j;
    for(int i = h; i < n; i+=h){

        temp = num[i];
        for(j = i-h; j >= 0 && temp < num[j]; j-= h){

            num[j+h] = num[j];
        }
        num[j + h] = temp;
    }
}

void input(){

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

}

void output(){

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

void shellsort() {

    int i, m = n;

    do{

        m = m/3+1;
        for(i = 0; i < m; i++)
            insertion_sort(m);
    }while(m > 1);
}

void BubbleSort(){

    int i = n -1, j, last;

    while(i > 0){

        last = 0;
        for (j = 0; j < i; j++) {
            if(num[j+1] < num[j]){

               swap(num[j+1], num[j]);
                last = j;           //后面没有发生交换说明后面已经有序;
            }
        }
        i = last;
    }
}

void quick_sort(int a[], int left, int right) {

     if(left < right) {
         int l = left, r = right, x = a[l]; //x是此次排序的标准点。
         while(1) {
             while(l < r && a[r] >= x) r--;  //r找比他小的数,放在前面;
             while(l < r && a[l] <= x) l++;   //l找比他大的数放在后面。
             if(l >= r) break;
             swap(a[r], a[l]);
         }

         swap(a[left], a[l]);
         output();
         quick_sort(a, left, l-1);
         quick_sort(a, l+1, right);
     }
}


void merge_sort(int a[], int l, int h) {

    if(l >= h) return;
    int m = (l+h)/2;
    merge_sort(a, l, m);  //递归的形式排序,应先递归后调整;
    merge_sort(a, m+1, h);
    int *arr = new int[h-l+1];  //申请数组;
    int k = 0;
    int i = l, j = m + 1;   //i j 分别表示两个半部分的开头位置

    while(i <= m && j <= h) {    //排序m两边的数据。
        if(a[i] < a[j]) {
            arr[k] = a[i];
            k++, i++;
        }
        else {
            arr[k] = a[j];
            k++, j++;
        }
    }
    if(i <= m) {  //如果左边有剩余,则全部放入arr数组中。
        while(i <= m) {
            arr[k] = a[i];
            k++, i++;
        }
    }
    if(j <= h) {   //如果右边有剩余,则也全部放入arr数组中;
        while(j <= h) {
            arr[k] = a[j];
            k++, j++;
        }
    }
    for(i = l; i <= h; i++) {  //把此段排好序的放回原数字。
        a[i] = arr[i-l];
    }
    delete []arr;   //释放申请的空间。
}

void selectsort(){

    int temp;
    for(int i = 0; i < n; i++){
            temp = i;
        for(int j = i + 1; j < n; j++){

            if(num[j] < num[temp])
                temp = j;
        }
        swap(num[i], num[temp]);
    }
}


int main()
{
    freopen("a.txt","r",stdin);
   // freopen("bb.txt","w",stdout);
    while(scanf("%d", &n) != EOF){

        input();
        output();
      // insertion_sort(1);  //直接插入排序算法. 稳定排序算法
       // shellsort(); // 希尔排序算法   不稳定排序算法
        // BubbleSort();  //冒泡排序算法;稳定算法。
         //quick_sort(num, 0, n-1); //快速排序
         //merge_sort(num, 0, n-1); //合并排序
           selectsort();          //选择排序;
        output();
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值