ios Swift 演算法

來源:互聯網
上載者:User

標籤: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)*/

基本整合通常基本演算法:

大致整合:

冒泡排序 -> 選擇排序->插入排序

希爾排序->堆排序->歸併排序-> 快速排序

這其中每種排序都有最佳化排序法,需要多練習、琢磨

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.