冒泡和快排
2015-07-29 21:13
218 查看
#include<stdio.h> #include<stdlib.h> // bool Swap(int *arr,int x,int y) // { // if(x==y) // return false; // else // { // arr[x]=arr[x]^arr[y]; // arr[y]=arr[x]^arr[y]; // arr[x]=arr[x]^arr[y]; // return true; // } // } void Swap(int *arr,int x,int y) { int temp=arr[x]; arr[x]=arr[y]; arr[y]=temp; } ////冒泡法稳定,相邻的元素比较///n^2/// void BubbleSort(int *arr,int len) { for (int i=0;i<len-1;i++)///记住一定是len-1趟,要保证最后有两个元素比较 { for(int j=len-1;j>i;j--) { if(arr[j]<arr[j-1]) ///相邻的两个记录比较,较轻的冒泡到最上面 Swap(arr,j,j-1); } } } //////快排/////不稳定,平均nlog(n) ////随机选择一个数字作为基数,假如选择数组最右侧作为基数 ////用变量j记录当前左边数字(比基数小的数)的最右边的数的下标 ////i从左到右遍历数组,如果arr[i]比基数小,则arr[i]属于左边的数, ////把j自增,交换arr[j]和arr[i]。交换之前由于arr[j]已从左边的数变成了右边的数 ////交换之后新的arr[j]又变成了左边的数,而j又变成了左边数最右的下标了 ////扫描结束后,把j自增(增后arr[j]又属于右边的数了)与最右边的基数交换,此时j为划分结果 int Partion(int *arr,int left,int right) { int j=left-1; int key=arr[right]; for(int i=left;i<right;i++)/////一定不要写成i<=right,会造成堆栈溢出满足不了left<=right if(arr[i]<=key) Swap(arr,++j,i); Swap(arr,++j,right); return j; } void Qsort(int *arr,int left,int right) { if(left>=right) return; int keyplace=Partion(arr,left,right); Qsort(arr,left,keyplace-1); Qsort(arr,keyplace+1,right); } int main() { int arr[]={9,4,6,3,2,8,4,2,1,1,5,0}; int len=sizeof(arr)/sizeof(arr[0]); //BubbleSort(arr,len); Qsort(arr,0,len-1); for(int i=0;i<len;i++) { printf("%d\t",arr[i]); } printf("\n"); system("pause"); }
相关文章推荐
- linux初学(十五)之linux网络基础
- JSONP请求控制
- hdoj 3277 Marriage Match III 【最大流经典建图】【二分 + 最大流 + 并查集】
- git使主干的一个分支成为自己fork分支的一个分支,即复制主干分支
- poj1861 最小生成树 prim & kruskal
- XHTML中的CSS样式
- 68 sql 查找表中同一个字段出现的重复项次数 视图
- Python多线程的threading Event
- CodeForces 1C Ancient Berland Circus
- 终于找到了一个靠谱的REST介绍
- 黑马程序员———Java AWT基础及布局管理
- 【Leetcode Algorithm】Summary Ranges
- hdu 5318 The Goddess Of The Moon (矩阵快速幂)
- PAT (Advanced Level) 1078. Hashing (25) 哈希,二次探测法
- Odoo8.0根据资料的条件来控制画面上的修改按钮显示
- java枚举
- 杭电 1856 more is better
- 汪汪
- HEVC学习
- c基础-homeworkTwo