C语言-郝斌笔记-006排序及查找

1.

 1 int partion(int *a, int low, int high)
 2 {
 3    int  value = a[low];
 4    int  t;
 5 
 6    while (low < high)
 7    {
 8       while( high > low && a[high] >= value)
 9          high--;  //会跳到8行的while去执行,而不是转到10行去执行if语句
10       if(high != low)
11       {
12            t = a[low];
13            a[low] = a[high];
14            a[high] = t;
15       }
16 
17       while(low < high && a[low] <= value)
18         low++;
19       
20       if(low != high)
21       {
22             t = a[low];
23            a[low] = a[high];
24            a[high] = t;
25       }
26    }
27    return low;
28 }

2.

 1 /*
 2     IBM <数据结构>上的介绍的比普通冒泡排序方法更快速的冒泡排序方法
 3 */
 4 
 5 # include <c:	urboc210-2ziliaosorthh.c>
 6 
 7 /*  该函数用的仍是冒泡排序,唯一不同的是我们加了个标志flag,一旦发现数组
 8 元素没有相互交换,我们就可以提前推出循环,从而节省了时间!
 9 
10 */
11 void sort(int *a, int n)  /* 冒泡升序排序 */
12 {
13     int  i, flag = 1, j;
14     int  temp;
15     
16     i=1;
17     while (flag)
18     {
19         flag = 0;
20         for (j=0; j<n-i; ++j)
21         {
22             if (a[j] > a[j+1])
23             {
24                 temp = a[j];
25                 a[j] = a[j+1];
26                 continue; //会跳去执行++j
27                 a[j+1] = temp;
28                 flag = 1;
29                 break; //会跳出for循环,转去执行32行的break语句
30             } 
31         }
32         break; //2 会跳出while循环
33         ++i;
34     }
35 }
36 
37 
38 main()
39 {
40     clrscr();
41     
42     printf("The array is:
");
43     prin(a,10);
44     sort(a,10);
45     printf("The sorted array is:
");
46     prin(a,10);
47     
48     getch();
49     return 0;
50 }
51 
52 /*
53 最后修改于07年正月初四晚上21:15 远通网吧!
54 
55 */

3.

 1 /*
 2     2007-5-21    
 3     折半查找算法【递归法来实现】
 4 */
 5 
 6 # include <stdio.h>
 7 
 8 /* 
 9     p指向数组首元素,n表示数足长度, val是待查找的元素,如果找到就返回该元素的下标,否则返回-1表
10     示没有找到 嘿嘿!
11 */
12 int Find(int* p, int low, int high, int val)
13 {
14     int mid = (low + high) / 2;
15     
16     if (low == high)  /* 不会存在low > high 的情况! */
17     {
18         if (p[mid] == val)
19         {
20             return mid;
21         }
22         else
23         {
24             return -1;  
25         }
26     }
27     else
28     {    
29         if (p[mid] < val)
30         {
31             Find(p,mid+1,high,val);
32         }
33         else if (p[mid] > val)
34         {
35             Find(p,low,mid-1,val);
36         }
37         else if (p[mid] == val) /* 最后这个else..if不要漏掉了,当然if (p[mid] == val)也可不写 */
38         {
39             return mid;    
40         }
41     }
42     
43     printf("李四!
");
44 }
45 
46 
47 
48 void Traverse(int* p, int n)
49 {
50     for (int i=0; i<n; ++i)
51         printf("%-5d",p[i]);
52     
53     printf("
");
54 }
55 
56 
57 int main(void)
58 {
59     int a[10] = {-10,1,23,54,55,76,88,100,200,9897};
60     
61     puts("原始数组的内容是:");
62     Traverse(a,10);
63     
64     int k = Find(a,0,9,-10);
65     if (-1 == k)
66         printf("没找到该元素!!!
");
67     else
68         printf("该元素的具体位置是 %d 
",k);
69     
70     return 0;
71 }
72 
73 /*
74     首先要明白,
75     折半查找的前提是数组中的元素已经排好序(无论升序降序都行)
76     
77 */
原文地址:https://www.cnblogs.com/shamgod/p/5394911.html