惯用的排序和查找(不定期更新)

常用的排序和查找(不定期更新)

冒泡排序

 1 void BubbleSort(int *a, int n)
 2 {
 3   int i,j,t;
 4   for(i=0; i<n-1; i++)
 5   {
 6     for(j=0; j<n-1-i; j++)
 7     {
 8       if(a[j]>a[j+1])
 9       {
10         t = a[j];
11         a[j] = a[j+1];
12         a[j+1] = t;
13       }
14     }
15   }
16 }

选择排序

 

 1 void SelectSort(int *a, int n)
 2 {
 3     int i,j,m,t;
 4     for(i=0; i<n-1; i++)
 5     {
 6         m = i;
 7         for(j=i+1; j<n; j++)
 8         {
 9             if(a[m]>a[j])
10             {
11                 m=j;
12             }
13         }
14         t=a[m];
15         a[m] = a[i];
16         a[i] = t;
17     }
18 }

插入排序

 

 1 void InsertSort(int *a, int n)
 2 {
 3     int in,out,t;
 4     for(out=1; out<n; out++)
 5     {
 6         t = a[out];
 7         in = out;
 8         while(in>0 && a[in-1]>=t)
 9         {
10             a[in] = a[in-1];
11             in--;
12         }
13         a[in] = t;
14     }
15 }

快速排序

 

 1 void QuickSort(int *a, int l, int r)
 2 {
 3     int i,j,t;
 4     if(l <r)
 5     {
 6         i=l;
 7         j=r;
 8         t = a[i];
 9         while(i<j)
10         {
11             while(i<j && a[j]>t) j--;
12             if(i<j)
13             {
14                 a[i] = a[j];
15                 i++;
16             }
17             while(i<j && a[i]<t) i++;
18             if(i<j)
19             {
20                 a[j] = a[i];
21                 j--;
22             }
23         }
24         a[i] = t;
25         QuickSort(a, l, i-1);
26         QuickSort(a, i+1, r);
27     }
28 }

 归并排序

 

 1 void Merge(int *initList, int *mergeList, int left, int mid, int right)
 2 {
 3     int i,j,k;
 4     i=left;
 5     j=mid+1;
 6     k=left;
 7     while(i<=mid && j<=right)
 8     {
 9         if(initList[i]<initList[j])
10         {
11             mergeList[k++]=initList[i++];
12         }
13         else
14         {
15             mergeList[k++]=initList[j++];
16         }
17 
18         if(i>mid)
19         {
20             while(j<=right)
21             {
22                  mergeList[k++]=initList[j++];
23             }
24 
25         }
26         else if(j>right)
27         {
28             while(i<=mid)
29             {
30                 mergeList[k++]=initList[i++];
31             }
32         }
33 
34     }
35 }
36 void MergePass(int *initList, int *mergeList, int n, int s)
37 {
38     int i,j;
39     for(i=0; i<=n-2*s+1; i+=2*s)
40     {
41         Merge(initList, mergeList, i, i+s-1, i+2*s-1);
42     }
43     if(i+s<n)
44         Merge(initList, mergeList, i, i+s-1, n-1);
45     else
46         for(j=i; j<=n-1; j++)
47         mergeList[j] = initList[j];
48 }
49 void MergeSort(int *a, int b, int n)
50 {
51     int s=1;
52     while(s<n)
53     {
54         MergePass(a, b, n, s);
55         s*=2;
56         MergePass(b, a, n, s);
57     }
58 }

 基数排序

 1 int get_index(int num, int dec,int order)
 2 {
 3     int i,j,n;
 4     int index;
 5     int div;
 6     for(i=dec; i>order; i--)
 7     {
 8         n=1;
 9         for(j=0; j<dec-1; j++)
10             n*=10;
11         div=num/n;
12         num-=div*n;
13         dec--;
14     }
15     n=1;
16     for(i=0;i<order-1;i++)
17         n*=10;
18     index=num/n;
19     return index;
20 }
21 void radis_sort(int array[], int dec, int order)
22 {
23     int i,j;
24     int index;
25     int tmp[10]={0};
26     int num[10]={0};
27     for(i=0; i<10; i++)
28     {
29         index=get_index(array[i], dec, order);
30         num[index]++;
31     }
32     for(i=1; i<10; i++)
33         num[i]+=num[i-1];
34     for(i=10-1;i>=0;i--)
35     {
36         index=get_index(array[i], dec, order);
37         {
38             j=--num[index];
39             tmp[j]=array[i];
40         }
41     }
42     for(i=0;i<10;i++)
43     {
44         array[i]=tmp[i];
45     }
46 }

 

二分查找

 

 1 int BinSelect(int x, int a[], int n)
 2 {
 3     int low=0, hight=n-1, mid;
 4 
 5     while(low <= hight)
 6     {
 7         mid = (low + hight)/2;
 8         if(x > a[mid])
 9         {
10             low = mid +1;
11         }
12         else if(x < a[mid])
13         {
14             hight = mid-1;
15         }
16         else if(x == a[mid])
17         {
18             return mid-1;
19         }
20 
21     }
22     return -1;
23 }