[关闭]
@chawuciren 2018-11-27T03:34:12.000000Z 字数 2201 阅读 592

CSI The Programming Layer-7

7-解决问题和算法

rCSI


7.1

解决问题的步骤

算法

分治

7.2

这一部分先说了简单变量,他是不可分的。接着开始分析一个选择算法,今天穿什么。
首先写出一个大致的过程,再看该过程是否需要细化。

有循环的算法

循环可以分为两种,一种是通过循环变量的计数来控制,一种通过循环体中的事件来控制。

先说第一种
循环可以分为三个部分,首先初始化循环不变量,然后检查该值是否到达了预定值,最后将这个变量加1。(是不是和for很像?)书上举了一个读取值10次并计算总和的例子。

然后是第二种
还是分成三步,先初始化事件,检查该事件,然后更新该事件。举计算平方根为例。
这个算法大致如下,先猜测结果是什么,然后将这个猜测值平方,如果误差比较小,就将猜测值作为结果。
用这种方法更新guess的值,guess+(square/guess)/2.0
注意:gusee的初始值设为square/4更接近答案

7.4

选择排序

将所有元素分为已排序与未排序,在未排序的元素中找到最小的一个元素,将其放入到已排序中

  1. void SelectionSort(int a[],int len){
  2. int i,j;
  3. for(i = 0 ; i < len-1 ; i++){
  4. int min_index = i; //存储最小值
  5. for(j = i + 1 ; j < len; j++)
  6. if(a[ min_index ] > a[j])//选出最小值
  7. min_index = j;
  8. if(min_index != i){
  9. int temp = a[i]; //若当前比较的a[i]>最小值,进行交换
  10. a[i] = a[min_index];
  11. a[min_index] = temp;
  12. }
  13. }
  14. }

//插入排序

冒泡排序

从第一个元素开始,如果它比下一个元素大,就交换两个元素的位置,然后再比较下一个元素,一直到不能交换为止。
到最后得到一个已排序的数组。

  1. void BubbleSort(int a[], int len)
  2. {
  3. int i=0;
  4. int j=0;
  5. int key=1;//用于替换
  6. for(i = 0 ; i < len - 1 ; i++)
  7. {
  8. for(j = 0 ; j < len - i - 1 ; j++)
  9. if(a[j] > a[j+1])//比较a[j]和a[j+1],大的向上交换,直到这一次全部比完。然后i+1,比较下一次
  10. {
  11. key = a[j];
  12. a[j] = a[j+1];
  13. a[j+1] = key;
  14. }
  15. }
  16. return;
  17. }

插入排序

将所有元素分为已排序与未排序,将未排序的元素的第一个元素插入到已排序的元素中

  1. int InsertionSort(int a[],int len){
  2. int key=0;//用于交换
  3. for(int i=0;i<len-1;i++){
  4. int j=i;
  5. do{
  6. if(a[j]>a[j+1]){ //假设a[j]已排好,a[j]与a[j+1],若a[j+1]大于前一位,交换,否则不交换。若还有更前一位,再比较。
  7. key=a[j];
  8. a[j]=a[j+1];
  9. a[j+1]=key;
  10. }
  11. j-=1; //j=j-1,若前一位存在,比较前一位
  12. } while(j>=0);
  13. }
  14. return ;
  15. }

快速排序

使用分治的思想,将最后一个元素作为比对值,比这个元素小的放在他的左边,比这个元素大的放在他的右边,然后递归,最后得到排好序的数组。

  1. int partition(int array[],int len){
  2. int x=array[len-1];
  3. int i=-1;
  4. for(int j=0;j<len-1;j++){//最后一个数内定了
  5. if(array[j]<=x){
  6. exchange(&array[i],&array[j]);
  7. i+=1;
  8. }
  9. }
  10. exchange(&array[i+1],&array[len-1]);
  11. i++;
  12. return i;
  13. }

上面那个程序,第一没有考虑i=-1时访问了非法空间,第二交换的时候交换错了,应该是i+1以后再交换

  1. int partition(int array[],int len){
  2. int x=array[len-1];
  3. int i=-1;
  4. for(int j=0;j<len-1;j++){//最后一个数内定了
  5. if(array[j]<=x){
  6. if(i==-1){
  7. i+=1;
  8. }+=1;
  9. else{
  10. exchange(&array[i],&array[j]);
  11. }
  12. }
  13. }
  14. i+=1;
  15. exchange(&array[i],&array[len-1]);
  16. return i;
  17. }

顺序查找

一个元素一个元素去找

  1. int search(int array[],int len,int x){
  2. int find=0;
  3. for(int i=0;i<len;i++){
  4. if(array[i]==x)
  5. find=1;
  6. if(find==1)
  7. break;
  8. }
  9. return find;
  10. }

二分查找

使用了分治的思想,将一个数组分成两半(只能针对排好序的数组)
还可以分为递归与非递归

递归

非递归

  1. int BinSearch(int sorted_arr[],int Len,int key)
  2. {
  3. int low=0;
  4. int high=Len-1;
  5. int mid=-1;
  6. while (low<=high)
  7. {
  8. mid=(low+high)/2;
  9. if (sorted_arr[mid]>key)
  10. {
  11. high=mid-1;
  12. }
  13. if(sorted_arr[mid]<key)
  14. {
  15. low=mid+1;
  16. }
  17. if(sorted_arr[mid]==key)
  18. {
  19. return mid;
  20. }
  21. }
  22. return -1;
  23. }

最后提到隐藏信息

在不同的人眼中一条狗是不同的

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注