常见面试排序: http://blog.csdn.net/pi9nc/article/details/12220851

快速排序:

选取第一个元素作为基准值:

1. /************************************************** 
2.  函数功能:对数组快速排序                        
3.  函数参数:指向整型数组arr的首指针arr;           
4.            整型变量left和right左右边界的下标    
5.  函数返回值:空                                   
6. /**************************************************/  
7. void QuickSort(int *arr, int left, int right)  
8. {  
9.  int i,j;  
10.  if(left<right)  
11.  {  
12.    i=left;j=right;  
13.    arr[0]=arr[i]; //准备以本次最左边的元素值为标准进行划分,先保存其值  
14.    do  
15.    {  
16.      while(arr[j]>arr[0] && i<j)   
17.        j--;        //从右向左找第1个小于标准值的位置j  
18.      if(i<j)                               //找到了,位置为j  
19.      {   
20.        arr[i] = arr[j];  
21.        i++;  
22.      }           //将第j个元素置于左端并重置i  
23.      while(arr[i]<arr[0] && i<j)  
24.        i++;      //从左向右找第1个大于标准值的位置i  
25.      if(i<j)                       //找到了,位置为i  
26.      {   
27.        arr[j] = arr[i];  
28.        j--;  
29.      }           //将第i个元素置于右端并重置j  
30.    }while(i!=j);  
31.    arr[i] = arr[0];         //将标准值放入它的最终位置,本次划分结束  
32.    quicksort(arr, left, i-1);     //对标准值左半部递归调用本函数  
33.    quicksort(arr, i+1, right);    //对标准值右半部递归调用本函数  
34.  }  
35. }  


随机选取基准值:
1. //使用引用,完成两数交换  
2. void Swap(int& a , int& b)  
3. {  
4. int temp = a;  
5. a = b;  
6. b = temp;  
7. }  
8. //取区间内随机数的函数  
9. int Rand(int low, int high)  
10. {  
11. int size = hgh - low + 1;  
12. return  low + rand()%size;   
13. }  
14.    //快排的partition算法,这里的基准数是随机选取的  
15. int RandPartition(int* data, int low , int high)  
16. {      
17. swap(data[rand(low,high)], data[low]);//  
18. int key = data[low];  
19. int i = low;  
20.   
21. for(int j=low+1; j<=high; j++)  
22. {  
23.  if(data[j]<=key)  
24.  {  
25.   i = i+1;  
26.   swap(data[i], data[j]);  
27.  }              
28. }   
29. swap(data[i],data[low]);  
30. return i;  
31. }  
32. //递归完成快速排序  
33. void QuickSort(int* data, int low, int high)  
34. {  
35. if(low<high)  
36. {  
37.  int k = RandPartition(data,low,high);  
38.  QuickSort(data,low,k-1);  
39.  QuickSort(data,k+1,high);  
40. }  
41. }  
有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(不要求保持原顺序)
        这题可能大家都能想到的方法是:设置首尾两个指针,首指针向后移动寻找大写字母,尾指针向前移动需找小写字母,找到后都停下,交换。之后继续移动,直至相遇。这种方法在这里我就不做讨论写代码了。
        但是这题也可以采用类似快排的partition。这里使用从左往后扫描的方式。字符串在调整的过程中可以分成两个部分:已排好的小写字母部分、待调整的剩余部分。用两个指针i和j,其中i指向待调整的剩余部分的第一个元素,用j指针遍历待调整的部分。当j指向一个小写字母时,交换i和j所指的元素。向前移动i、j,直到字符串末尾。代码如下:
[cpp] view plaincopy
1. #include <iostream>  
2. using namespace std;  
3. void Proc( char *str )  
4. {  
5. int i = 0;  
6. int j = 0;  
7. //移动指针i, 使其指向第一个大写字母  
8. while( str[i] != '\0' && str[i] >= 'a' && str[i] <= 'z' ) i++;  
9. if( str[i] != '\0' )  
10. {  
11. //指针j遍历未处理的部分,找到第一个小写字母  
12. for( j=i; str[j] != '\0'; j++ )  
13. {  
14. if( str[j] >= 'a' && str[j] <= 'z' )  
15. {  
16. char tmp = str[i];  
17. str[i] = str[j];  
18. str[j] = tmp;  
19. i++;  
20. }  
21. }  
22. }  
23. }  
24. int main()  
25. {  
26. char data[] = "SONGjianGoodBest";  
27. Proc( data );  
28. return 0;  
29. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值