Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269874
  • 博文数量: 88
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 840
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-20 21:13
文章分类

全部博文(88)

文章存档

2022年(1)

2017年(1)

2016年(2)

2015年(1)

2014年(83)

分类: C/C++

2014-04-21 12:23:37

1.快速排序
这个是各大公司笔试面试最喜欢考的排序算法。
简单点说,就是先找一个数为“轴”(一般取第一个数即可),先从后向前扫描,找到比轴小的就交换,然后再从换过去的位置开始向后扫描,找到比轴大的就交换,然后重复上面的两步。最后分轴两边使用递归(这里面要多次使用while)。道理就这么简单!下面看代码:

点击(此处)折叠或打开

  1. #include<iostream>
  2. using namespace std;
  3. void quick_sort(int s[],int,int);
  4. int main(){
  5.     int a[10]={49,232,43,543,12,156,32,78,332,54};
  6.     for(int i=0;i<10;i++){
  7.         cout<<a[i]<<" ";
  8.     }
  9.     cout<<endl;
  10.     quick_sort(a,0,9);
  11.     for(int j=0;j<10;j++){
  12.         cout<<a[j]<<" ";
  13.     }
  14.     cout<<endl;
  15.     return 0;
  16. }

  17. void quick_sort(int s[],int start,int end){
  18.     if(start<end){
  19.         int i=start,j=end,x=s[start];    //x 为轴
  20.         while(i<j){
  21.             while(i<j&&s[j]>=x)
  22.                 --j;
  23.             if(i<j)
  24.                 s[i]=s[j];
  25.             while(i<j&&s[i]<x)
  26.                 ++i;
  27.             if(i<j)
  28.                 s[j]=s[i];
  29.         }
  30.         // 将轴填充回去,然后递归
  31.         s[i] = x;    
  32.         quick_sort(s,start,i-1);
  33.         quick_sort(s,i+1,end);
  34.     }
  35. }
结果:


2. 冒泡排序
冒泡排序重点在于,如果数组长度为s,就会排s趟,然后每一趟都会搞定一个数,所以第i趟会比较 s-i 次。理解了这一点两层for循环就很容易写出来了。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. int main(){
  3.     int i,j,temp;
  4.     int a[10];
  5.     for(i=0;i<10;i++)
  6.         scanf ("%d,",&a[i]);

  7.     for(j=0;j<=9;j++){
  8.         for(i=0;i<10-j;i++)
  9.             if (a[i]>a[i+1]){
  10.                 temp=a[i];
  11.                 a[i]=a[i+1];
  12.                 a[i+1]=temp;
  13.             }
  14.         }
  15.     }

  16.     for(i=1;i<11;i++)
  17.         printf("%5d,",a[i] );
  18.     printf("\n");
  19.     return 0;
  20. }
3.插入排序
插入排序解决的是在已经有序的数列中插入一个数,然后数列仍然有序的算法。
重点在于,你需要有一个缓存的地方,然后使要插入的数一一与原数列中的数进行比较。找到合适的位置就插入。要注意数组可能越界的情况。
1)数组形式

点击(此处)折叠或打开

  1. void insertion_sort(int array[],int first,int last)
  2. {
  3. int i,j;
  4. int temp;
  5. for(i=first+1;i<=last;i++)
  6. {
  7. temp=array[i];
  8. j=i-1;
  9. //与已排序的数逐一比较,大于temp时,该数移后
  10. while((j>=first)&&(array[j]>temp)){
  11. array[j+1]=array[j];
  12. j--;
  13. }
  14. array[j+1]=temp;
  15. }
  16. }
2)链表形式,更通用

点击(此处)折叠或打开

  1. void insert_sort(intarray,unsigned int n)
  2. {
  3. int i,j;
  4. int temp;
  5. for(i=1;i<n;i++)
  6. {
  7. temp=*(array+i);
  8. for(j=i;j>0&&*(array+j-1)>temp;j--)
  9. {
  10. *(array+j)=*(array+j-1);
  11. }
  12. *(array+j)=temp;
  13. }
  14. }

阅读(272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~