搜尋與排序 + 指標

Text

Bubble sort

void bubbleSort(int a[], int n)
{
	for (int i = 0; i < n; i++)
    {
    	for (int j = i + 1; j < n; j++)
        {
        	if (a[i] > a[j])
            	swap(a[i], a[j])
        }
    }
}

先從左到右兩兩比對跑一次, 此時最小的就會在左邊,以此類推跑n次後,前i小的就會在第i次排序好

Insertion sort

每次插入一個新數字,如果當前的值比新數字大,將所有值往後移一格,再把空出的格子填入新數字

void insertionSort(int arr[], int n) 
{

    for (int i = 1; i < n; i++) 
    {
        int key = arr[i];  // 要插入的值
        int j = i - 1;
        while (j >= 0 && arr[j] > key) 
        {
            arr[j + 1] = arr[j]; // 往後移
            j--;
        }
        arr[j + 1] = key; // 插入正確位置
    }
}

補充語法

vector 比較好用的陣列

vector<int> vec; // 宣告陣列
vec.push_back(1); //輸入參數
vec.pop_back(); // 刪除末端內容
vec.size(); //輸出vector的大小

vec.begin(); // 陣列開始的"記憶體位置"
sort(vec.begin(), vec.begin + n); //排序前n個
sort(vec.begin(), vec.end());     //從頭排序到尾

指標(pointer)-

指標是一種變數,用來存放記憶體位址

int a; // 一個普通的整數變數
int *ptr = &a; // ptr是指標,&a代表取得a的記憶體位址

既然可以存放記憶體,那也可以配置一塊記憶體

int *p = new int; // 新配置的一塊記憶體
*p = 42;
cout << *p << endl; // 輸出42
delete p;         //既然是新配置的,那麼也要記得刪除

int *arr = new int [10]; //配置新的陣列所需的記憶體
delete[] arr;            //清除陣列記憶體

指標(pointer)

new 的記憶體是從哪裡拿的?

我如果忘記delete會怎麼樣?

 

用動態配置的記憶體不會自動釋放,所以他會一直佔據空間

造成Memory leak(記憶體外洩)

指標和參考變數雖然觀念題不考,實作也不一定會用到,但是很重要的觀念!

參考變數

跟原本一模一樣的變數,改動此變數的時候,原本的變數的值也會跟著改動。

int a; // 一個普通的整數變數
int &cpa = a; // cpa是a的參考變數

為甚麼會需要指標和參考變數?

* 變數的作用域

* 方便記錄的另一種方法

Merge sort

將陣列不停切半,確保左邊的排序好,右邊的也排序好,最後將兩個陣列合併

void MergeSort(vector<int> &arr, int start, int end) 
{
	  int mid = (start + end) / 2;
      if(start == end)
      	return;
      MergeSort(arr, start, mid);
      MergeSort(arr, mid + 1, end);
      Merge();
}

啊關鍵的Merge怎麼寫?

先自己想想看!下次公布

void MergeSort(int &arr[], int start, int end) 
{
	  int mid = (start + end) / 2;
      MergeSort(arr[], start, mid);
      MergeSort(arr[], mid + 1, end);
      Merge();
}

Quick sort

在數列中任意挑選一個數,稱為pivot

然後調整數列,

使得「所有在pivot左邊的數,都比pivot還小」

而「在pivot右邊的數都比pivot大」。

接著,將所有在pivot左邊的數視為「新的數列」

所有在pivot右邊的數視為「另一個新的數列」

隨機

rand/srand可以用來產生隨機數
但要注意,電腦生成的隨機數並不是完全隨機,而是通過複雜的演算法讓亂數種子對應出相對的亂數

#include <cstdlib>
#include <bits/stdc++.h>
using namespace std;
int main()
{
	int x;
	srand(x); // 設定亂數種子
	cout << rand(); // 隨機產生的數字
}

Time

通常上面的隨機可以再搭配time函數達成製造每次都不一樣的結果

#include <ctime>
#include <cstdlib>
#include <bits/stdc++.h>
using namespace std;
int main()
{
	time_t start = time(0); // 「從1970年1月1日0時0分0秒」到「現在」的時間差,單位為秒。
    srand( time(NULL) );

    /* 產生亂數 */
    int x = rand();
}
Made with Slides.com