1. 程式人生 > >面試題—用選擇排序法對單鏈表進行升序排序

面試題—用選擇排序法對單鏈表進行升序排序

演算法描述:

定義指標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基於一種假設:認為最近使用過的數據將來被使用的概率也大,最近沒有被訪問的數據將來被使用的概率比較低。