面試題—用選擇排序法對單鏈表進行升序排序
演算法描述:
定義指標p和q,p用來遍歷指標,q為聯動指標。 定義pmax和qmax。pmax指向當前連結串列中值最大的結點,qmax指向值最大結點的前驅結點
用指標p遍歷連結串列head找出當前連結串列中的值最大的結點,用pmax指向該結點。然後利用qmax將該最大值結點從連結串列head中刪除,利用頭插法插入連結串列head1中。 重複操作即可
程式碼如下:
結構體定義:
typedef struct node{
int data;
struct node *next;
}ElemSN;
//選擇排序法對單向連結串列進行升序排序 ElemSN* SelectSort(ElemSN *head){ ElemSN *head1,*p,*q,*pmax,*qmax; head1=NULL; while(head){ for(q=pmax=head,p=head->next;p;q=p,p=p->next){ //用p指標遍歷連結串列,找出當前連結串列最大值給pmax,qmax為前驅指標 if(p->data>pmax->data){ pmax=p; qmax=q; } } if(pmax-head){ qmax->next=pmax->next; }else{ head=head->next; } pmax->next=head1; //將找出的最大值結點頭插到連結串列head1中 head1=pmax; } return head1; }
相關推薦
面試題—用選擇排序法對單鏈表進行升序排序
演算法描述: 定義指標p和q,p用來遍歷指標,q為聯動指標。 定義pmax和qmax。pmax指向當前連結串列中值最大的結點,qmax指向值最大結點的前驅結點 用指標p遍歷連結串列head找出當前連結串列中的值最大的結點,用pmax指向該結點。然後利用qmax將該最大值
對單鏈表進行重排序
要求:形式如L0->L1->L2->L3-> ... ->Ln-1->Ln,要求重新排序成如下形式:L0->Ln->L1->Ln-1->…… 如給定連結串列為1->2->3->4->5->6,則重新排序後的結果為1
用Camshift算法對指定目標進行跟蹤
namespace opened callback 總結 edr spl ng- his 選擇 原理 Camshift算法是Continuously Adaptive Mean Shift algorithm的簡稱。它是一個基於MeanSift的改進算法。它首
數據結構對單鏈表進行數據排序
tar ocs tmc www fan div wke userinfo exc 匭z16ka藕2時mc脊允http://t.docin.com/gpkdx21266 絞0沿6qgwm譾薔jzhttp://docstore.docin.com/sina_637079836
騰訊面試題 快慢指標演算法快速找到單鏈表中間值
快速找到未知長度的單鏈表的中間節點 普通方法就是遍歷兩次,第一次遍歷得到連結串列長度,第二次遍歷得到中間值。時間複雜度為1.5n。(這裡需要強調1.5) 快速連結串列方法就是利用兩個指標,慢指標每次移動一個數據,快指標每次移動兩個資料。最外層的迴圈用快指標。當快
騰訊面試題:快速找到未知長度單鏈表的中間結點
題目:快速找到未知長度單鏈表的中間結點首先分析一下,既然是一個面試題,就一定有普通方法和高階方法,而高階方法無疑會為你大大加分!普通方法很簡單:首先遍歷一遍單鏈表以確定單鏈表的長度L。然後再此從頭結點出發迴圈L/2次找到單鏈表的中間結點。普通方法的演算法複雜度為:O(L+L/
連結串列經典面試題之從尾到頭列印單鏈表
題目: 要求將一無頭單鏈表的節點從尾到頭打印出來。這是一道經典的面試題,今天我們來介紹它的五種解決方法。1 解決思路: 定義兩個指標,一個指向連結串列頭(pcur),一個指向每次要列印的節點(pprint)。每次讓pcur來遍歷,程式碼實現如下://從尾到頭列印單鏈表
單鏈表-用尾插法建立單鏈表
#include <iostream> #include <stdlib.h> using namespace std; typedef int ElemType;
Java語言 對單鏈表進行排序
clas sys arr void while nod static pri str 方法:交換鏈表節點的值 public class SortLinked { public static void main(String[] args) { int[] a= {1,4
對鏈表進行插入排序
移動 排序 數據 ret 自己 ins tlist 所有 列表 題目是leetcode上面的,題目內容如下: 對鏈表進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該鏈表可以被認為已經部分排序(用黑色表示)。每次叠代時,從輸入數據中移除一個元素(用紅色表
對學生成績進行升序排序
在測試類中完成如下要求 a) 將五名學生新增到ArrayList集合 b) 使用Collections.sort(List<T> list, Comparator<? super
LeetCode--147.對鏈表進行插入排序
技術分享 宋體 操作 int ont 方便 復雜 開始 定位 題目描述: 插入排序的動畫演示如上。從第一個元素開始,該鏈表可以被認為已經部分排序(用黑色表示)。 每次叠代時,從輸入數據中移除一個元素(用紅色表示),並原地將其插入到已排好序的鏈表中。 插入排序算法:
147. 對鏈表進行插入排序
ron 演示 head gif ini 分析 tps 輸入數據 turn 題目描述 對鏈表進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該鏈表可以被認為已經部分排序(用黑色表示)。 每次叠代時,從輸入數據中移除一個元素(用紅色表示),並原地將其插入到已排好序的
ACMNO.18 C語言-選擇排序 用選擇法對10個整數從小到大排序。 輸入 10個整數 輸出 排序好的10個整數
題目描述 用選擇法對10個整數從小到大排序。 輸入 10個整數 輸出 排序好的10個整數 樣例輸入 4 85 3 234 45 345 345 122 30 12 樣例輸出 3 4 12 30 45 85 122 234 345 345
C#面試題:選擇排序法
選擇排序法:個人認為,選擇排序法是一種改良版的氣泡排序法。 大家可以比較一下氣泡排序法的程式碼,和選擇排序法的程式碼。 void SelectSort(int[] arr){ for(int i=0;i<arr.Length;i++){
C語言選擇法對陣列元素進行排序
選擇法排序是C語言中一種簡便的排序方法,其演算法的基本思想很易於理解,下面以對陣列的元素降序排列來談一談: 首先求出未排序的陣列中的最大的元素,將其放在陣列的a0的位置; 接著從剩餘的元素中再求出最大的元素,將其放在陣列的a1的位置; 依此向後推,很容易寫出對應的程式程
冒泡法與選擇法對10個數進行從小到大的排序
//對10個數字按照從小到大的排序 氣泡排序: #include <stdio.h> int main() { int i; int j; int temp
1、從控制檯輸入5個數,用氣泡排序法對它們排序,再輸出。
#include<iostream.h> void main(){ int i,j,k,t; int a[5]; cout<<"請輸入5個數:"<<endl; for(i=0;i<5;i++) cin>>a[i];
[面試題] 用最快的方法找到唯一一個不連續成對出現的字母
面試題:除了某一個字母以外,其他字母都是連續成對出現的,比方說“AABBCCDDEFFGGHH”,用最快的方法找到其中的“E”。 思路:最快的方法肯定不是順序遍歷整個字串,因為那樣做的時間複雜度是O(n)。仔細觀察這個字串,實際上是很有規律的,前面正常成對出現
【面試題】LRU算法及編碼實現LRU策略緩存
max 防止 技術分享 nbsp pri value 概念 閾值 使用 概念 LRU(least recently used)就是將最近不被訪問的數據給淘汰掉,LRU基於一種假設:認為最近使用過的數據將來被使用的概率也大,最近沒有被訪問的數據將來被使用的概率比較低。