標籤:style class blog code color 檔案
// Playground - noun: a place where people can playimport Cocoavar nums = Int[]()for _ in 1...50{ nums.append(random())}nums////冒泡排序/*var count = 0;for(var i = 0 ; i < nums.count-1; i++){ for(var j = 0; j < nums.count-i-1;j++){ count++; if(nums[j] > nums [j+1]){ let temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; } }}count*/////冒泡排序 最佳化版/*var count = 0;var flag = true;for (var i = 0; i < nums.count - 1 && flag ; i++) {//外層訓話 flag = false; for (var j = 0; j < nums.count - i - 1; j++) {//內層迴圈 count++; if (nums[j] > nums[j + 1]) {//比較大小,大的放後面,小的放前面 var temp = nums[j]; nums[j] = nums[j + 1]; nums[j + 1] = temp; flag = true; } }}count*//////選擇排序/*for(var i = 0; i < nums.count; i++){//外層掃面控制 var min = i;//用來記錄值最小的下標,預設假設第數組第一個元素為最小。 for(var j = i; j < nums.count ; j++){ if(nums[j] < nums[min]){//找出min下標中元素還小的值的下標 min = j;//保持min始終為最小元素的小標 } } if i != min { //一趟掃描結束後判斷是否找出了最小的值,如果有的話就交換,將這個最小值移動到此次掃描資料的最前端 var temp = nums[i]; nums[i] = nums[min]; nums[min] = temp; }}nums*///插入排序/*for (var i = 1; i < nums.count; i++) {// 外層對無序列表的掃描 if (nums[i] < nums[i - 1]) { var temp = nums[i];// 儲存該點的值,等會要將該值插入適當位置 var j = i - 1; for (; j >= 0 && temp < nums[j]; j--) {// 往後移 tips此處千萬不要 是nums[i] < nums[j]來比較, //因為nums[i]這個值在一次移位後就被覆蓋了,因此也為什麼要用temp來儲存這個值的原因 nums[j + 1] = nums[j];// 數組往後移 } nums[j + 1] = temp; } }nums*///希爾排序/*var increment = nums.count;//增量while(increment > 1){ increment = increment/2 ;//增量計算 //一下基本同插入排序,只是直接插入排序我們比較時是增量是1,shell排序設定了一個自己的增量 for(var i = increment; i<nums.count;i++){ if(nums[i] < nums[i-increment]){ var temp = nums[i]; var j = i - increment; for(;j >= 0 && temp < nums[j] ; j -= increment ){ nums[j+increment] = nums[j]; } nums[j+increment] = temp } } }nums*//*//堆排序func HeapAdjust(nums : Int[],node : Int,length : Int){ if ((node*2+1) <= length-1) {// 保證該節點為非葉子節點,因為葉子節點就沒意義了 var child = node * 2 + 1;//位元組點座標,主要是交換完後需要以該child為節點判斷以及調整大根堆 if (child + 1 <= length-1) {//如果有有右子樹 if (nums[child + 1] > nums[child]) { child++;//判斷後如果右子樹大於左子樹,child++,即等會要操作的是左子樹節點 } } if(nums[node] < nums[child]){//大的子樹與node比較 //交換 var temp = nums[node]; nums[node] = nums[child]; nums[child] = temp; //再次重構 HeapAdjust(nums, child, length); } }}var n = nums.count;//step1:序列構建成大根堆for(var i = (n-1)/2 ;i >= 0; i--){ //即對每個節點和其子節點的大根堆構造 HeapAdjust(nums, i, n);}nums//step2:遍曆最大元素移動到末端for(var x = (n-1) ; x > 0 ; x--){ var temp = nums[x]; nums[x] = nums[0]; nums[0] = temp; //step3:重構 HeapAdjust(nums, 0, x);}nums*///歸併排序/*func Merging(nums : Int[] , head: Int , mid : Int , tail : Int ) { var mius = tail-head+1 var temp : Int[] = Int[]() // tail-head+1 // 申請額外空間 for _ in 1...mius { temp.append(0) } var low = head; var lowTow = head; var lowTowFine = head; var high = tail; var j = mid + 1; var p = 0; mius //兩個子序列都非空 while (head <= mid && j <= tail) { if (nums[head] > nums[j]) { temp[p++] = nums[j++]; } else { temp[p++] = nums[lowTow++]; } } //第一個子序列非空,將其中剩餘的元素複製到temp中 while (head <= mid) {// temp[p++] = nums[lowTowFine++]; } //第二個子序列非空,將其中剩餘的元素複製到temp中 while (j <= tail) {// temp[p++] = nums[j++]; } //將緩衝中的刷到歸併序列中 for(var q = 0 , t = low ; t <= high ; q++ , t++){ nums[t]=temp[q];//歸併完成後將結果複製回R[low..high] } //Merge}var length = nums.count;for (var n = 1; n < nums.count; n *= 2) {// 做logn 趟歸併 var i:Int; for (i = 0; i + 2 * n - 1 <= length-1; i = i + 2 * n) { Merging(nums, i, i + n - 1, i + 2 * n - 1);// 歸併長度為length的兩個相鄰子檔案 } if (i + n - 1 < nums.count-1) // 尚有兩個子檔案,其中後一個長度小於length { Merging(nums, i, i + n - 1, nums.count-1); // 歸併最後兩個子檔案 } }nums*//*//快速排序func partition( nums : Int[] , lower : Int ,higher: Int ) -> Int { var key = nums[lower]; var numsTwo : Int[] = nums// var temp : Int[]; var high:Int = higher var low:Int = lower while low < high { while (low < high && numsTwo[high] >= key) { high-- } if (low < high) { var temp = numsTwo[low]; numsTwo[low] = numsTwo[high]; numsTwo[high] = temp; } while (low < high && numsTwo[low] <= key) { low++; } if (low < high) { var temp = numsTwo[low]; numsTwo[low] = numsTwo[high]; numsTwo[high] = temp; } } return low;}func quickSort(nums : Int[] , low: Int , high: Int ) { var mid:Int; if (low < high) { mid = partition(nums, low, high); quickSort(nums, low, mid - 1); quickSort(nums, mid + 1, high); }}quickSort(nums,0,0)*/
基本整合通常基本演算法:
大致整合:
冒泡排序 -> 選擇排序->插入排序
希爾排序->堆排序->歸併排序-> 快速排序
這其中每種排序都有最佳化排序法,需要多練習、琢磨