11---------几种简单排序算法

来源:互联网 发布:电信内蒙古大数据 编辑:程序博客网 时间:2024/06/01 14:18
  • 链表的排序(简单插入排序)
  • 冒泡排序
  • 双端冒泡排序
  • 插入排序
  • 简单选择排序
  • 快速排序
  • 堆排序
#include<stdio.h>/** 链表的排序(简单插入排序)* 冒泡排序* 双端冒泡排序* 插入排序* 简单选择排序* 快速排序* 堆排序*/typedef struct Node{    struct Node * next;    int data;}Node;//链表的排序void TraveseNodes(Node * node){    Node * p,*q,*s;    if(node ->next != NULL){        p = node->next->next;        node ->next->next = NULL;   //先断开链表        while(p){            q = node;            while(q){                if(p->data > q->next->data){    //在前半部分表中找到第一个大于该结点的结点                    break;                }                q = q->next;            }            s = p->next;            p->next = q->next;            q->next = p;            p = s;        }    }}//冒泡排序void bubbleSort(int arr[],int n){    int i,j;    int flag = 1;    int temp;    for(i=n-1;i>=1&&flag;i++){        flag = 0;        for(j=0;j<i;j++){            if(arr[j]>arr[j+1]){                temp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = temp;                flag = 1;            }        }    }}void swap(int arr[],int a,int b){    int temp = arr[a];    arr[a] = arr[b];    arr[b] = temp;}//双端冒泡排序void doubleBubbleSort(int arr[],int n){    int i,j;    int flag = 1;    int left=0,right=n-1;    while(flag){        flag = 0;        for(i=left;i<=right;i++,right--){            if(arr[i]>arr[i+1]){                swap(arr,i,i+1);                flag = 1;            }        }        for(j=right;j>=left;j--,left++){            if(arr[j-1]>arr[j]){                swap(arr,j,j-1);                flag = 1;            }        }    }}//插入排序void insertSort(int arr[],int n){    int i,j;    int temp;    for(i=1;i<n;i++){        temp = arr[i];        for(j=i-1;j>=0&&temp<arr[j];j--){            arr[j+1] = arr[j];        }        arr[j+1] = temp;    }}//简单选择排序void selectSort(int arr[],int n){    int i,j;    for(i=0;i<n-1;i++){        for(j=i+1;j<n;j++){            if(arr[i] < arr[j]){                swap(arr,i,j);            }        }    }}//快速排序void quickSort(int arr[],int left,int right){    int i=left,j=right;    int temp;    if(left < right){        temp = arr[left];        while(i<j){            while(i<j&&arr[j]>temp) j--;            if(i<j){                arr[i] = arr[j];                i++;            }            while(i<j&&arr[i]<temp) i++;            if(i<j){                arr[j] = arr[i];                j--;            }        }        arr[i] = temp;        quickSort(arr,left,i-1);        quickSort(arr,i+1,right);    }}//调整堆void shift(int arr[],int low,int high){    int temp = arr[low];    int i,j=low;    for(i=low*2;i<high;i*=2){        if(arr[i+1] > arr[i]) i++;        if(temp<arr[i]){            arr[j] = arr[i];                j = i;        }else{            break;  //如果temp本身比左右孩子的值都大的话,那么就跳出循环        }       }    arr[j] = temp;}//注意结点下标从1开始,否则就要修改上面二叉树调整算法void heapSort(int arr[],int n){ //下标范围为1-n 实际上数组大小为n+1    int i;    for(i=n/2;i>=1;i--){        shift(arr,i,n);    }    for(i=n;i>=2;i--){        swap(arr,n,1);        shift(arr,1,i-1);    }}int main(){    return 0;}
原创粉丝点击