iOS開發-一些面試算法總結

由於最近需要面試,筆試的時候遇到了不同的算法,上網搜了一些

這裏把常考到的常用排序算法簡單彙總了下。

包括冒泡排序,簡單選擇排序,直接插入排序,希爾排序,堆排序和快速排序。


[objc] view plaincopy
  1. //常用排序彙總  
  2.   
  3. #include <stdio.h>  
  4.   
  5. void swap(intint *a, intint *b);  
  6. void bubble_sort(int a[], int n);  
  7. void select_sort(int a[], int n);  
  8. void insert_sort(int a[], int n);  
  9. void shell_sort(int a[], int n);  
  10. void heap_adjust(int a[], int i, int n);  
  11. void heap_sort(int a[], int n);  
  12. void quick_sort(int a[], int low, int high);  
  13.   
  14. int main()  
  15. {  
  16.     int arr[] = {0,2,3,1,6,9,8,7,4,5};  
  17.       
  18. //    bubble_sort(arr, 10);  
  19. //    select_sort(arr, 10);  
  20. //    insert_sort(arr, 10);  
  21. //    shell_sort(arr, 10);  
  22. //    heap_sort(arr, 10);  
  23.     quick_sort(arr, 09);  
  24.       
  25.     for (int i = 0; i < 10; i++)  
  26.     {  
  27.         printf("%d\n", arr[i]);  
  28.     }  
  29.       
  30.     return 0;  
  31. }  
  32.   
  33. //交換數據  
  34. void swap(intint *a, intint *b)  
  35. {  
  36.     int tmp = *a;  
  37.     *a = *b;  
  38.     *b = tmp;  
  39. }  
  40.   
  41. //冒泡排序法  
  42. //時間複雜度O(n^2) 空間複雜度O(1)  
  43. void bubble_sort(int a[], int n)  
  44. {  
  45.     int i, j;  
  46.     //旗幟位,判斷這次遍歷是否有交換  
  47.     int flag = 1;  
  48.       
  49.     for (i = 0; i < n && flag; i++)  
  50.     {  
  51.         flag = 0;  
  52.         for (j = n-2 ; j >= i; j--)  
  53.         {  
  54.             if (a[j] > a[j+1])  
  55.             {  
  56.                 swap(&a[j], &a[j+1]);  
  57.                 flag = 1;  
  58.             }  
  59.         }  
  60.     }  
  61. }  
  62.   
  63. //簡單選擇排序  
  64. //時間複雜度O(n^2) 空間複雜度O(1)  
  65. void select_sort(int a[], int n)  
  66. {  
  67.     int i, j, min;  
  68.       
  69.     for (i = 0; i < n ; i++)  
  70.     {  
  71.         min = i;  
  72.         for (j = i+1; j < n; j++)  
  73.         {  
  74.             if (a[j] < a[min])  
  75.             {  
  76.                 min = j;  
  77.             }  
  78.         }  
  79.         if (min != i)  
  80.         {  
  81.             swap(&a[min], &a[i]);  
  82.         }  
  83.     }  
  84. }  
  85.   
  86. //直接插入排序  
  87. //時間複雜度O(n^2) 空間複雜度O(1)  
  88. void insert_sort(int a[], int n)  
  89. {  
  90.     for (int i = 0; i < n ; i++)  
  91.     {  
  92.         int temp = a[i];  
  93.         int j = i-1;  
  94.         while (j>=0 && a[j] > temp)  
  95.         {  
  96.             a[j+1] = a[j];  
  97.             j--;  
  98.         }  
  99.         a[j+1] = temp;  
  100.     }  
  101. }  
  102.   
  103. //希爾排序  
  104. //時間複雜度爲O(nlogn) 空間複雜度爲O(1)  
  105. void shell_sort(int a[], int n)  
  106. {  
  107.     int i,j,temp;  
  108.     int gap = 0;  
  109.     while (gap <= n) gap = gap*3+1;  
  110.     while (gap > 0)  
  111.     {  
  112.         for (i = gap; i < n; i++)  
  113.         {  
  114.             temp = a[i];  
  115.             j = i - gap;  
  116.             while (j >= 0 && a[j] > temp)  
  117.             {  
  118.                 a[j+gap] = a[j];  
  119.                 j = j - gap;  
  120.             }  
  121.             a[j+gap] = temp;  
  122.         }  
  123.         gap = (gap-1)/3;  
  124.     }  
  125. }  
  126.   
  127. //堆排序  
  128. //時間複雜度爲O(nlogn) 空間複雜度爲O(1)  
  129. void heap_sort(int a[], int n)  
  130. {  
  131.     for (int i = n/2 - 1; i >= 0; i--)  
  132.     {  
  133.         heap_adjust(a, i, n);  
  134.     }  
  135.     for (int i = n-1; i > 0; i--)  
  136.     {  
  137.         swap(&a[0], &a[i]);  
  138.           
  139.         heap_adjust(a, 0, i);  
  140.     }  
  141. }  
  142.   
  143. //構建大頂堆  
  144. void heap_adjust(int a[], int i, int n)  
  145. {  
  146.     int child, temp;  
  147.       
  148.     for (temp = a[i]; 2*i+1 < n; i = child)  
  149.     {  
  150.         child = 2*i+1;  
  151.         //取得較大子結點索引  
  152.         if (child < n -1 && a[child] < a[child+1]) child++;  
  153.         //保證父結點大於等於子結點  
  154.         if (temp < a[child]) swap(&a[i], &a[child]);  
  155.         else break;  
  156.     }  
  157. }  
  158.   
  159. //快速排序  
  160. //時間複雜度爲O(nlogn) 空間複雜度爲O(logn) ~ O(n)  
  161. void quick_sort(int a[], int low, int high)  
  162. {  
  163.     int i = low+1;  
  164.     int j = high;  
  165.     int key = a[low];  
  166.       
  167.     if (low >= high) return;  
  168.       
  169.     while (1) {  
  170.         while (key<a[j]) j--;  
  171.         while (key>a[i] && i<j) i++;  
  172.         if (i >= j) break;  
  173.           
  174.         swap(&a[i], &a[j]);  
  175.           
  176.         if (a[i] == key) j--;  
  177.         else i++;  
  178.     }  
  179.       
  180.     swap(&a[low], &a[j]);  
  181.       
  182.     if (i-1>low) quick_sort(a, low, i-1);  
  183.     if (j+1<high) quick_sort(a, j+1, high);  
  184. }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章