数据结构与算法

2016-11-14  本文已影响0人  灬古月丶残云彡

常见算法

Bubble Sort (冒泡法) (i, j, j < len - 1 - i)
int arr[5] = {3, 1, 4, 5, 2};
bubbleSort(arr, 5);
void bubbleSort(int arr[], int len)
{
   int i, j, temp;
   for (i = 0; i < len; i++) {
     for (j = 0; j < len - 1 - i; j++) {
        if(arr[j] > arr[j + 1]) { // > 升序, < 降序
          temp = arr[j];
          arr[j] = arr[j + 1];
          arr[j+1] = temp;
        }
     }
   }
}
Insertion Sort (插入排序) (j , p, j > 0 && arr[j - 1] > tmp)
int arr[5] = {3, 1, 4, 5, 2};
InsertionSort(arr, 5);
void InsertionSort(int arr[], int len)
{
    int j, p;
    for (p = 1; p < len; p++) {
        int tmp = arr[p];
        for (j = p; j > 0 && arr[j - 1] > tmp; j--) { 
            arr[j] = arr[j - 1];
        }
        arr[j] = tmp;
    }
}
Shell Sort(希尔排序) (increment, j >= increment; arr[j - increment], break)
int arr[5] = {3, 1, 4, 5, 2};
ShellSort(arr, 5);
void ShellSort(int arr[], int len)
{
    int i, j, increment;
    for (increment = len / 2; increment > 0; increment /=  2) { // loop increment
        for ( i = increment; i < len; i ++) {                   // loop i
            int tmp = arr[i];                                   // TMP
            for (j = i; j >= increment; j -= increment) {       // loop j (>=)
                if (arr[j] < arr[j - increment]) {              // Judge (j - increment)
                    arr[j] = arr[j - increment];                // Exchange
                } else {
                    break;                                      // Break **
                }
            }
            arr[j] = tmp;                                       // TMP exchange
        }
    }
}
Dutch National Flag Problem (荷兰旗子问题) (begin, current, end)
char bails[9] = {'r', 'b', 'r', 'w', 'w', 'r', 'b', 'w', 'b'};
sort(bails, 9)
void sort(char Arr[], int N)
{
  int begin, current, end;
  begin = current = 0;
  end = N - 1;
  while (current <= end) {
    if (Arr[current] == 'r') {
      swap(&Arr[current], &Arr[begin]);
      current++;
      begin++;
    } else if (Arr[current] == 'w') {
      current++;
    } else {
        swap(&Arr[current], &Arr[end]);
      end--;
    } 
  } 
}
void swap(char *A, char *B)
{
    char tmp = *A;
    *A = *B;
    *B = tmp;
}
Quickly Sort (快速排序)
int arr[5] = {3, 1, 4, 5, 2};
quicklySort(arr, 0, 4);  // [left , right] 区间内排序
void quicklySort(int arr[], int left, int right)
{
    if (left > right) {
        return;
    }
    
    int i = left;
    int j = right;
    int key = arr[left];
    
    while (i < j) {
        
        while (i < j && key <= arr[j]) {       // 如果降序 改为 >=
            j--;
        }
        
        arr[i] = arr[j];
        
        while (i < j && key >= arr[i]) {    // 如果降序 改为 <=
            i++;
        }
        arr[j] = arr[i];
    }
    arr[i] = key;
    quicklySort(arr, left, i - 1);
    quicklySort(arr, i + 1, right);
}
上一篇下一篇

猜你喜欢

热点阅读