void swap(int a, int b)
// 2.加法
void swap(int a, int b)
// 3.異或(相同為0,不同為1. 可以理解為不進製加法)
void swap(int a, int b)
2、求最大公約數。
/** 1.直接遍曆法*/
int maxcommondivisor(int a, int b)
}
return max; }
/** 2.輾轉相除法*/
int maxcommondivisor(int a, int b)
return b; }
// 擴充套件:最小公倍數= (a * b)/最大公約數
3、模擬棧操作
/** 棧是一種資料結構,特點:先進後出
*/ 練習:使用全域性變數模擬棧的操作
#include
#include
#include
static int data[1024]; //棧最多能儲存1024個資料
static int count = 0;//目前已經放了多少個數(相當於棧頂位置)
//資料入棧
push void push(int x)
//資料出棧
pop int pop()
//檢視棧頂元素
top int top()
//查詢棧滿
full bool full()
return 0; }
//查詢棧空
empty bool empty()
return 0; }
int main()
//出棧
while(!empty())
printf("\n");
return 0; }
4、排序演算法
1.選擇排序:將已排序部分定義在左端,然後選擇未排序部分的最小元素和未排序部分的第乙個元素交換。
/**
* 【選擇排序】:最值出現在起始端
* 第1趟:在n個數中找到最小(大)數與第乙個數交換位置
* 第2趟:在剩下n-1個數中找到最小(大)數與第二個數交換位置
* 重複這樣的操作...依次與第三個、第四個...數交換位置
* 第n-1趟,最終可實現資料的公升序(降序)排列。
*/
void selectsort(int *arr, int length)
} }
} 2.氣泡排序:將已排序部分定義在右端,在遍歷未排序部分的過程執行交換,將最大元素交換到最右端。
/**
*【氣泡排序】:相鄰元素兩兩比較,比較完一趟,最值出現在末尾
*第1趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第n個元素位置
*第2趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第n-1個元素位置
*…… ……
*第n-1趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放後)逐個推進,最值最後出現在第2個元素位置 */
void bubllesort(int *arr, int length)
} }
} 3.插入排序:將已排序部分定義在左端,將未排序部分元的第乙個元素插入到已排序部分合適的位置。
4、折半查詢(二分查詢)
/**
*折半查詢:優化查詢時間(不用遍歷全部資料)
*折半查詢的原理:
* 1> 陣列必須是有序的
* 2> 必須已知min和max(知道範圍)
* 3> 動態計算mid的值,取出mid對應的值進行比較
* 4> 如果mid對應的值大於要查詢的值,那麼max要變小為mid-1
* 5> 如果mid對應的值小於要查詢的值,那麼min要變大為mid+1 *
*/
// 已知乙個有序陣列, 和乙個key, 要求從陣列中找到key對應的索引位置
int findkey(int *arr, int length, int key)
else if (key < arr[mid])
else
}
return -1; }
鍊錶排序演算法
1 題目 對亂序的鍊錶進行排序,要求空間複雜度為常數。leetcode 148 中等 輸入 4 2 1 3 輸出 1 2 3 4 輸入 1 5 3 4 0 輸出 1 0 3 4 5 2 思路 對於這題我有兩種解法,一種是時間複雜度o n2 對於暴力解法,我們會將整個鍊錶分為 有序段 和 無序段 兩段...
演算法 鍊錶排序
sort a linked list in o n log n time using constant space complexity.example 1 example 2 歸併排序 首先將鍊錶從中部切分為兩個部分,不斷遞迴這個過程 遞迴回溯的時候將兩個鍊錶歸併為有序鍊錶 public list...
排序演算法 鍊錶實現
陣列的高效體現於隨機訪問,插排 快排等排序演算法未用到這一特點,故這兩種排序演算法可基於鍊錶實現 插入排序 迭代器 p順序訪問鍊錶 迭代器 i順序訪問前 p 個元素 主要的操作為 當p i p.value刪除原位置的 p將p插入 i 1 與 i 之間 若為單向鍊錶,儲存 i 1與 p 1 演算法複雜...