/*快速排序 *1.分解:将x[low:high]分为3段,x[low:pivotkey-1] *x[pivotkey],x[pivotkey+1:high]三段,使得 *x[low:pivotkey-1]的所有元素小于等于x[pivotkey] *x[pivotkey+1,high]的所有元素大于等于x[pivotkey] *2.递归求解:分别对x[low:pivotkey-1],x[pivotkey+1,high]递归 *调用快速排序 *3.合并 */ #include <iostream> using namespace std; int partion(int*,int,int); //参数x是待排序数组,low是数组开始下标,high是结束下标
void quick_sort(int* x,int low,int high){ int pivotkey; if(low <high){ pivotkey=partion(x,low,high); quick_sort(x,low,pivotkey-1); quick_sort(x,pivotkey+1,high); } } //参数x是待排序数组,low是数组开始下标,high是结束下标
int partion(int* x,int low,int high) { int pivotkey; pivotkey=x[low];//保存x[low]
while(low<high){ while(low<high&&x[high]>=pivotkey) --high; x[low]=x[high];//从high到low找到x[high]小于x[pivotkey]的元素,将它放到x[low]
while(low<high&&x[low]<=pivotkey) ++low; x[high]=x[low];//从low到high找到x[low]大于x[pivotkey]的元素,将它放到x[high]
} x[low]=pivotkey; return low; }
int main() { int x[10]={10,7,9,8,6,5,3,2,4,1}; quick_sort(x,0,9); for (int i=0;i <10;i++) { printf("%d ",x[i]); } return 0; }
|
//链表排序,使用冒泡法
#include <stdio.h> #include <stdlib.h> typedef int Type; typedef struct Node{ Type data; struct Node *next; }Node;
void insert(Type data,Node **head){//插入一个节点
Node *tmp = (Node*)malloc(sizeof(Node)); tmp->next=*head; tmp->data=data; *head=tmp; } void print_list(Node *head){//打印链表
Node *tmp=head; while(tmp){ printf("%d ", tmp->data); tmp=tmp->next; } printf("\n"); } void swap(Type *a,Type *b){//交换a,b所指向的元素
Type tmp=*a; *a=*b; *b=tmp; } void sort_list(Node **head){//排序链表,插入排序
if(!*head||!(*head)->next)//空链表或单个元素链表,无需排序
return; Node *i,*j; int len=1; i=*head; while(i=i->next) len++;//链表长度
for(;len>0;len--){//进行n-1次冒泡
i=j=(*head); while(j->next){//进行一次冒泡
j=j->next; if(i->data>j->data) swap(&i->data,&j->data); i=j; } } } int main(){ Node *head=NULL; int a[5]={5,3,4,1,2}; for(int i=0;i<5;i++) insert(a[i],&head); print_list(head);//排序前输出
sort_list(&head);//排序
print_list(head);//排序后输出
return 0; }
|
堆排序,顺序存储,时间复杂度O(nlogn),空间复杂度为O(1)
#include <stdio.h> #include <stdlib.h> #include <time.h> //堆排序,前提是完全二叉树
void swap(int *x,int *y){ *x=(*x)^(*y); *y=(*x)^(*y); *x=(*x)^(*y); } /*找最大的孩子,如果大于本身,则交换二者,并继续递归调用该孩子所在的子树 *a待排序数组 *index要进行调整的索引 *limit最大序号 */ void sift_up(int a[], int index, int limit){ int j;//保存大的孩子下标
for(int i=index;2*i+1<=limit;i=j){//保证至少有一个左孩子
if(2*i+2<=limit&&a[2*i+2]>a[2*i+1])//有右孩子,且右孩子大于左孩子
j=2*i+2; else j=2*i+1; if(a[j]>a[i])//比当前节点大
swap(&a[i],&a[j]); else//当前节点最大,调整结束
return; } return;//到达叶子节点
} //调整
void adjust(int a[], int index, int limit){ for(int i=(limit-1)/2;i>=0;i--)//调整为大顶堆
sift_up(a,i,limit); for(int i=limit;i>0;){//交换堆顶到最后,然后再循环交换到减1的位置
swap(&a[0], &a[i]); i--; sift_up(a,0,i); } } int main(){ int a[100]; for(int i=0;i<100;i++){ a[i]=rand()%1000; printf("%d ", a[i]); } adjust(a,0,99); printf("\n"); printf("\n"); for(int i=0;i<100;i++) printf("%d ", a[i]); }
|
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(485) | 评论(0) | 转发(0) |