https://stackoverflow.com/questions/8832085/jqgrid-change-filter-search-pop-up-form-to-be-flat-on-page-not-a-dialog/24528183#24528183


JQ그리드에서 서치 할때 어떻게 하면 쉽게 할 수 있을까 

테이블 내에 칼럼 서칭이나 옵션클릭을 통해 서칭을 구현하는 부분은 쉽게 가능했지만.


일반적인 서칭이 안되는 상황 아 결국 이건 전통적인 방법으로 구현해야 하나...하지만

귀차니즘으로 만들기 보다는 


서칭을 쉽게 구현  할 수 있는 방법이 있지 않을까해서

검색 했고 

찾았다.!

  


이거면 끝 

enter image description here


Employee name:
<input type="text" name="employeeName" id="employeeName" style="width:250px" />

<!--  This will be my jqGrid control and pager -->
<table id="tblEmployees"></table>
<div id="pager"></div>
$("#employeeName").on('change keyup paste', function () {
    SearchByEmployeeName();
});

function SearchByEmployeeName()
{
    //  Fetch the text from our <input> control
    var searchString = $("#employeeName").val();

    //  Prepare to pass a new search filter to our jqGrid
    var f = { groupOp: "AND", rules: [] };

    //  Remember to change the following line to reflect the jqGrid column you want to search for your string in
    //  In this example, I'm searching through the UserName column.

    f.rules.push({ field: "UserName", op: "cn", data: searchString });

    var grid = $('#tblEmployees');
    grid[0].p.search = f.rules.length > 0;
    $.extend(grid[0].p.postData, { filters: JSON.stringify(f) });
    grid.trigger("reloadGrid", [{ page: 1 }]);
}


출처 :http://frontierdev.tistory.com/ 


$("#grid").jqGrid({

                            

 url: '/managerListJsonTest.action',

 caption: "시스템 관리자 리스트",           // caption : 그리드의 제목을 지정한다.

             datatype: "json",                        // datatype : 데이터 타입을 지정한다.

             loadtext : '로딩중...',

             mtype : 'post',                           // mtype : 데이터 전송방식을 지정한다.

//          loadonce : true,    // loadonce : rowNum 설정을 사용하기 위해서 true 지정한다.

 rowNum:10,                              // 한화면에 보여줄 row 

 width:'auto',                              // 그리드 전체 넓이 조정 (오토 조절 가능)

             autowidth:true,                         // 오토 조절 가능 (width 옵션과 동시 사용 불가!)

             rowList:[5,10,20,30],                 //  화면에서   있는 row 수를 조절 가능

             pager:'#pager',                         // 페이징을 처리할 <div> 태그의 #+id

             rownumbers: true,                    // row 숫자를 표시해준다.

             sortname:'idx',                          // 처음 그리드를 불러올 때에 정렬 기준 컬럼

//           viewrecords: true,          // 그리드가 보여줄  페이지 현재 페이지등의 정보를 노출

//           multiselect: true,            // 멀티 셀렉트 박스가 첫번째 컬럼에 생김

             sortorder:"desc",            // 정렬 기준

             sortable: true,                         // colmodel 에서 sortable 기능 사용하려면 true!

             caption:"시스템 관리자 리스트",    // 그리드 상단에 그리드의 제목을 입력할  있음

             height: "300",                          // 그리드 높이 설정

             editurl: "URL.action",                // 셀이 수정될  수정 요청을 받아서 처리할 URL

             cellEdit: true,                          //  수정 기능을 사용하려면 true!

             cellsubmit:'remote',                    

             cellurl:'/managerjqGridCRUD.action'//  수정  submit url

             gridview:true,

 


jsonReader : {                                                  

                                        page: "page",

                                        total: "total",

                                        root:  "resultList",

                                        records:"record",

 

//                                    다른 사용 ) function 기능을 이용하여 사용 

//                                     page:  function(obj){

//                                                  alert(JSON.stringify(obj));

//                                                  alert(obj.jObj1.page);

//                                                  return obj.jObj1.page;

//                                                  alert( $.parseJSON(obj.json).page);

//                                                  return $.parseJSON(obj.json).page;

//                                               },                                                      

//                                     total:  function(obj){

//                                                  alert(obj.jObj1.total);

//                                                  return obj.jObj1.total;

//                                                  alert( $.parseJSON(obj.json).total);

//                                                  return $.parseJSON(obj.json).total;

//                                                },

//                                     root:  function(obj){                                },

//                                     records: function(obj){                            },

repeatitems: false

                                      },

 

colNames:[

"번호",

                           "아이디",

                           "이름",

                           "비밀번호",

                           "연락처",

                           "이메일",

                           "직급",

                           "부서",

                           "승인",

                           "대행사코드",

                           "시도회코드",

                           "비고"

],

colModel:[

{ name : 'idx',                    index : 'idx',               width : 100,            

   align : 'center',     hidden : true,             key:true    },

{ name : 'adminID',            index : 'adminID',         width : 100,            

   align : 'left'      },

{ name : 'adminName',     index : 'adminName',    width : 100,              

   align : 'left',     },

{ name : 'adminPWD',      index : 'adminPWD',      width : 100,             

   align : 'left',         edittype:'password',

hidden: true,                   editrules:{edithidden:true, required:true},             editable:true   },

{ name : 'adminPhone',    index : 'adminPhone',    width : 100,              

   align : 'left',         editable     : true  },

{ name : 'adminEmail',     index : 'adminEmail',     width : 100,              

   align : 'left',         hidden:true,

editrules:{edithidden:true}, editable:true},

{ name : 'adminPosition',  index : 'adminPosition',  width : 100,               

   align : 'left',         editable     : true

   edittype: 'select',  formatter:'select',  editoptions:{ value : positionlist }},

{ name : 'adminDepart',   index : 'adminDepart',    width : 100,              

    align : 'left',         editable     : true,  

    edittype: 'select',  formatter:'select',  editoptions:{ value : departlist }},

{ name : 'adminAuth',      index : 'adminAuth',      width : 100,              

   align : 'left',         editable     : true

   edittype: 'select',  formatter:'select',  editoptions:{ value :

{"0":"super","1":"master","2":"manager","3":"내부대행사"

  ,"4":"외부대행사","9":"사용중지"} }},

{ name : 'gisaCode',        index : 'gisaCode',        width : 100,             

    align : 'left',         editable     : true  },

{ name : 'branch',           index : 'branch',          width : 100,              

    align : 'left',         editable     : true  },

{ name : 'adminContent',  index : 'adminContent', width : 100,                

    align : 'left',         hidden:true,

    editrules:{edithidden:true}, editable:true},

],

 

gridComplete : function() {

            //load time가져오기!

var tm = jQuery("#grid").jqGrid('getGridParam','totaltime'); 

$("#load_time").html("Render time: "+ tm+" ms ")

},

loadError:function(xhr, status, error) {

                          // 데이터 로드 실패시 실행되는 부분

                          alert(error);

             },

             onSelectRow: function(ids) {    

                 //row 선택시 처리. ids 선택한 row

//alert('row 선택시 ids:'+ids);

             },          

ondblClickRow: function (rowid, iRow, iCol, e) {

                          $("#grid").editGridRow(rowid, updateDialog);

             },

             //그리드 수정시 submit                        

             beforeSubmitCell : function(rowid, cellname, value) {   

                          return {"id":rowid, "cellName":cellname, "cellValue":value}

             },

             //그리드 수정시 submit 

             afterSubmitCell : function(res) {    

                          var aResult = $.parseJSON(res.responseText);

                          var userMsg = "수정시 오류가 발생되었습니다.";

  if((aResult.jqResult == "1")) {

userMsg = "수정되었습니다.";

                              alert(userMsg);

                          }

                          return [(aResult.jqResult == "1") ? true : false, userMsg];

  }                                                               

              }).navGrid('#pager', {

                      edit: true,

                      add : true,

                      del : true,

                      search : false,              

                      refresh: true,

                      view: true

                  },

                     updateDialog,

     addDialog,

                     deleteDialog,

                    {closeOnEscape:true}

              )

}).trigger('reloadGrid');






설명:


jqGrid 초기화 설정은 여러가지 방법이 있다.

1)페이지 로딩시 빈 grid를 먼저 출력하고 검색조건에 따라 jqGrid로 뿌려주는 방법

2)페이지 로딩시 바로 조회하여 grid에 뿌려주는 방법


1번 경우는 추후에 업데이트..

2번 경우는 페이지 특성상 테이터가 많지 않고 바로 보여줌.

여기에선 2번방식으로 함.


jsonReader는 json방식으로 jqGrid에 맞는 json 형태로 가져와 page, rows, total, records 매핑된다.

서버단에서 데이터를 jqGrid의 json방식으로 만들어줘서 뿌려주면된다.


예)   

{
      "total":10, 
      "page":10, 
      "records":10, 
      "rows": [
          {"컬럼명1:value1, 컬럼명2:value2},
          {"컬럼명1:value1, 컬럼명2:value2},
      ]

}


아래와 같이 서버단에서 json으로 만들었다.

spring 경우는 resultMap으로 가져오면 되지만

현재 예제에선 struts2 기반으로 되어 있어서 아래와 같이 정보를 가져오게 했다.ㅠㅠ

주의) 저의 경우는

jqGrid에 root

 root:  "resultList", 으로 data를 매칭시켰다.


{

 "cellName":null,

 "cellValue":null,

 "id":null,

 "idx":null,

 "jqResult":0,

 "oper":null,

 "page":1,

 "records":10,

 "resultList":[

  { "adminAuth":"0", "adminContent":"","adminDepart":12,"adminEmail":""

    ,"adminID":"chltal","adminName":"수민","adminPWD":"********","adminPhone":""

    ,"adminPosition":12,"adminTel":"","branch":"","gisaCode":"","idx":105

    ,"regDate":"2015-12-15 10:53:51.0"}

  }

],

"rows":10,

"sidx":"idx",

"sord":"desc",

"total":6

}


만약 page, total 등 매핑이 되지 않으면 jqGrid에서 data를 어떻게 가져오는지 확인 바란다.

예) 이와같이 resultMap 안에 jqGrid의 매핑이 된다면....

{

 "resultMap":{

 "page":1,

 "records":10,

 "resultList":[

  { "adminAuth":"0", "adminContent":"","adminDepart":12,"adminEmail":""

    ,"adminID":"chltal","adminName":"수민","adminPWD":"********","adminPhone":""

    ,"adminPosition":12,"adminTel":"","branch":"","gisaCode":"","idx":105

    ,"regDate":"2015-12-15 10:53:51.0"}

  }

],

"rows":10,

"sidx":"idx",

"sord":"desc",

"total":6

}

}

위의 주석처리된

page:  function(obj){ 

return obj.resultMap.page;

}

으로 방식으로 처리 한다.


colModel

jqGrid data에 옵션을 설정하는 부분이다.


1)

{ name : 'idx',  index : 'idx',  width : 100,   align : 'center',  hidden : true,             key:true },

여기에서 idx가 DB에서 pk값임으로 key: true로 설정했다.

나중에 수정할시 idx값이 그리드상에서 hidden(숨김)으로 되어있지만 idx값을 던져준다.


2)

{ name : 'adminPWD',      index : 'adminPWD',      width : 100,  

   align : 'left',              edittype:'password',        hidden: true,       

editrules:{edithidden:true, required:true},        editable:true   },

패스워드경우 edittype: 'password'로 하였고, 히든설정

editrules 경우 옵션들이 많은데 edithidden:true, required:true  설정할경우

그리드에서 보여지지 않지만 editor 할경우 패스워드 필드가 보여진다.


3)

{ name : 'adminDepart',   index : 'adminDepart',    width : 100,   align : 'left',

  editable : true,  edittype: 'select'

 formatter:'select',  editoptions:{ value : departlist }},

그리드에서 값을 select 박스로 변경하였다.

editoptions의 값을 DB에서 코드로 가져와서 사용하였다.


처음 페이징 호출할 때 

var selectValue = $.ajax({

         url: "/commonSelectList.action",

         data: {codetype: 'depart'},

         async: false

        });

var departlist = selectValue.responseJSON.resultMap;


ajax로 코드값을 호출하여 departlist 에 넣어뒀다.

물론 json방식으로 4번형식처름 가져왔다.



4)

{ name : 'adminAuth',      index : 'adminAuth',      width : 100,    align : 'left',         editable     : true,  edittype: 'select',  

formatter:'select',  editoptions:{ 

value : {"0":"super","1":"master","2":"manager","3":"내부대행사"

  ,"4":"외부대행사","9":"사용중지"}}},                                                   

그리드에서 값을 select 박스로 변경하였다.

DB에서 코드를 가져오지 않고 직접 여기에서 값을 매핑하여 처리하면된다.





navGrid 경우

그리드 하단에 추가, 편집, 삭제, 보기, 찾기 등

기능을 사용할 수 있다.


 }).navGrid('#pager', {

                      edit: true,

                      add : true,

                      del : true,

                      search : false,              

                      refresh: true,

                      view: true

                  },

                     updateDialog,

     addDialog,

                     deleteDialog,

                    {closeOnEscape:true}

              )

편집사용, 추가사용, 삭제사용, 검색 미사용, 재실행 사용, 보기 사용

navGrid에서도 옵션을 줄수 있다.


//업데이트

var updateDialog = {

                   url: '/managerjqGridUpdate.action'

                   , closeAfterEdit: true

                   , closeOnEscape: true

                   , modal: true

                   , width: "400"

};




//추가           

var addDialog = {

addCaption: "관리자 등록"                            

      ,bSubmit: "등록"

      ,url: '/managerjqGridUpdate.action'

      ,closeAfterAdd: true

      ,closeOnEscape: true

      ,modal: true                           //모달창

      ,savekey : [true, 13]               //enter키  

      ,recreateForm:true                 //수정  등록   재생성 - 필수

      ,width: "400"

      ,beforeInitData: function(formid) {

          $("#grid").jqGrid('setColProp','adminID',{editable:true});

          $("#grid").jqGrid('setColProp','adminName',{editable:true});

      }

      ,afterShowForm: function (formid) {

    $("#grid").jqGrid('setColProp','adminID',{editable:false});

          $("#grid").jqGrid('setColProp','adminName',{editable:false});

     }

};                       

//삭제           

var deleteDialog = {

        url: '/managerjqGridUpdate.action'

        , closeAfterEdit: true

        , closeOnEscape: true

        , modal: true

        , width: "400"

    };


편집과 삭제는 기능이 비슷하다.

추가경우는 그리드에서 editable을 설정하지 않는 컬럼들이 있어서 beforeInitData 함수에서

editable설정하였고, 저장이후에 다시 editable를 설정 변경하였다.












출처: http://frontierdev.tistory.com/1 [국경없는 개발]


오라클에서 데이터를 실수로 삭제했을 때 

15분 내에서 복구 가능하다.


1. 복구가능한지 조회해 보자..


SELECT * FROM users_auth AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE) WHERE user_ID = 'admin';


2. 찾은 데이터를 DB에 인서트 시키자


INSERT INTO users_Auth 


SELECT * 


  FROM users_auth 


 AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '15' MINUTE) 


WHERE USER_ID = 'admin' ;


10분전 데이터 조회


SELECT * FROM MENU AS OF TIMESTAMP(SYSTIMESTAMP-INTERVAL '10' MINUTE);

테이블 완전히 비운 후 10분전 데이터 인서트

INSERT INTO MENU SELECT * FROM MENU AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '10' MINUTE);




java.lang.ClassNotFoundException: 발생할 경우


프로젝트

Properties -> Deployment Assembly -> Add Click -> Java Build Path Entries -> Next -> Maven Dependencies -> Finish


요렇게 하면 정상 구동 됨;;;헐 대박

오라클 sql developer 기준


C:\Users\hrd401\AppData\Roaming\SQL Developer\SqlHistory

              사용자명 


여기가면 temp로 남아있다 혹시 저장하지 않은 쿼리가 날아간경우 여기 한번 가보셈..

오전에 작업한거 ㅜ.ㅜ날아간줄 알고 깜놀 했으나 여기 전부 살아있음..;;





MVC 패턴에 대해서 먼저 공부해보자. 모델-뷰-컨트롤러(Model-View-Controller, MVC)는 소프트웨어 공학에서 사용되는 아키텍처 패턴이다. 


* 아키텍처 패턴 


아키택처 패턴전에 아키텍처를 알아보자, 

아키텍처의 영문 어원은 Architecture = archi(fisrt, cheif, govern) + tect(build)이다. 건물을 구출할 때 전체적인 구조를 관리하는 의미이다. 

 

 소프트웨어 아키텍처는 무엇인가? 


'소프트웨어 시스템을 구성하는 서브시스템과 컴포넌트, 그리고 그것들의 관계를 나타내는 용어이다.'

- Pattern-Oriented Software Architecture, Volume 1: A System of Patterns


'아키텍처는 컴포넌트로 구체화된 시스템의 기본적인 조직이며 환경에 대한 관계이고 디자인과 진화를 이끄는 원리이다.'

- IEEE1471



 소프트웨어 아키택처를 지칭하는 말들을 정리하면 시스템 즉 프로그램을 구성하는 구성요소(서브시스템, 컴포넌트)와 그들(구성요소) 간의 관계를 나타낸다. 건축을 할때 처럼 기초 토목 공사에서 건물의 외장까지 이르런 설계가 매우 중요한 것처럼, 프로그램을 제작할때 , 시스템을 구성할때 소프트웨어 아키택처가 필요하다. 프로그램의 점점 규모가 커져 복잡해지면 아키텍처의 존재는 불가결하다. 


아키텍처 패턴


 디자인 패턴과 마찬가지로 특정 문제를 해결하기 위해 반복되어 사용되는 솔루션을 문서화한 것이다. 아키텍처 패턴은 소프트웨어 시스템의 구조를 체계적으로 구성하기 위한 기본적인 스키마를 제시한다. 미리 정의된 패턴간의 책임을 명시하여 규칙과 가이드라인을 제시한다. 


아키택처 패턴의 장점 :

1. 검증

2. 시뮬레이션

3. 쉬운 이해


*MVC 패턴이란? 


대표적인 아키택처 패턴의 하나로 시스템 전체를 Model과 View, Controller 세 개의 컴포넌트(더 큰 프로그램이나 구조물에서 식별 가능한 "일부분") 로 나뉘어 있다. 


* Model : 핵심 데이터와 기능을 캡슐화 [ 상태의 변화가 있을때 컨트롤러와 뷰에 이를 통보함, 통보를 통해 뷰는 최신의 결과를 출력, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가,제거,수정할 수 있다. ]

* View : 사용자에게 정보를 Display, 각뷰마다 컴포넌트 하나씩 연결된다. 사용자는 오직 컨트롤러를 통해서만 시스템과 상호작용한다.  [ 모델로 부터 결과물을 생성한다. ]

* Controller : 데이터와 비즈니스 로직 사이의 상호동작을 관리 [ 모델에 명령을 보내 모델의 상태를 변경할 수 있다. ]





* 실선은 직접적인 관계를 , 점선은 간접적인 관계를 나타낸다. 


MVC 의 개념을 웹에 적용한 예


1. 사용자가 웹사이트에 접속 [controller 사용]

2. Controller 는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출해야한다. 

3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후 그 결과를 리턴한다. 

4. Controller 는 Model 이 리턴한 결과를 View 에 반영한다. 

5. 데이터가 반영된 View 는 사용자에게 보여진다.



Hello World 동작 원리

1. 클라이언트 요청 

2. web.xml 에서 디스패처 서블릿(Dispatcher Servlet) 클라이언트 요청을 핸들링

3. servlet-context.xml 에서 해당 클래스의 웹요청을 처리하는 컨트롤러를 사용 [HanderMapping으로 Controller 검색]

4. 해당 Controller 가 요청 처리 후, Home (View) 로 리턴 [뷰의 이름은 /WEB-INF/views/home.jsp 로 바뀐다.

5. View 에 출력





* 디스패처 서블릿(Dispatcher Servlet)


 디스패처 서블릿은 클라이언트의 요청을 앞단에서 컨트롤 하기 위해 존재한다. 

컨트롤러에 요청을 객체로 넘겨주기 전에 클라이언트의 요청을 받아 Controller 를 검색하고 , Controller 의 처리 결과를 전달 받아 View를 출력해주는 역할을 한다. 요청을 처리할 Contorller 를 만들어 처리한 결과를 출력해 줄 View 가 필요한다. 


'/Hello/src/main/webapp/WEB-INF/web.xml'


서블릿의 이름은 appServlet 이고, 서블릿 클래스가 'org.springframework.web.servlet.DispatcherServlet' 으로 지정 되어있다.


초기화 파라메터(init-param; initial parameter 

<init-param> 으로 contextConfigLocation 을 설정해 준다. init-param 은 초기화 파라메터를 설정하는 부분이다.

컨텍스트의 위치는 WEB-INF/spring/appServlet/servlet-context.xml 로 되어있다. 아래의 servlet-context.xml 파일을 보자.



/Hello/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml


 맨위의 annotation-driven 은 어노테이션 기반을 사용하겠다고 설정하는 것이다. 컨트롤러 작성을 클래스에 @Controller 어노테이션을 붙여 해당 클래스를 웹 요청 처리를 하는 컨트롤러로 사용할 수 있다. (스프링 2.5부터)


 resources 태그는 HTTP GET 으로 들어온 /resources/~ 형태의 요청(보통 정적 파일)을 웹어플리케이션루트/resouces 디렉토리로 지정을 하겠다는 것이다. 


 웹 페이지에서 최종형태는 HTML 같은 형태의 뷰인데, 기본적으로 템플릿에는 jsp 페이지로 되어 있다. 컨트롤러는 ViewResovler 를 통해 View 객체를 리턴한다. 위의 파일의 'InternalResourceViewResolver' 가 리졸버로 지정되어 있다. 


 아래에서 설명할 View 리턴은 , prefix 가 /WEB-INF/views/ 이고 , suffix 가 .jsp 로 생성된다. 결국 /WEB-INF/views/home.jsp 로 바뀐다.


/hello/ 요청


localhost 의 8080포트로 GET /hello/HTTP/1.1 요청을 하면 서블릿은 /hello 를 보고 hello 쪽으로 넘기고 hello 프로젝트 관점에서는 / 라는 리소스의 요청이 있다. 이 요청은 HomeController 클래스가 담당하도록 템플릿이 만들어준다. 



/Hello/src/main/java/com/hellowolrd/hello/HomeController.java


@Controller 라는 어노테이션이 붙어 있으면 서버가 시작할때 RequestMappingHandlerMapping 에 의해서 자동으로 등록이 된다. HomeController 에는 home 이라는 메소드에 @RequestMapping 이라는 어노테이션이 붙어있다. 요청처리를 매핑하기 위한 어노테이션인데, HTTP GET 으로 '/' 에 대한 처리를 담당 한다. 


 브라우저에서 요청한 http://localhost:8080/hello/ 는 Homecontroller.home 이라는 메소드로 돌아온다. 

home 메소드는 java.text.DataFormat 클래스에서 현재 날짜와 시간을 해당 로케일에 맞게 가져온 후에 문자열로 만들어 serverTime 이라는 속성에 넣어 home 이라는 뷰에 넘긴다

 


 Home 이라는 뷰이름은 /WEB-INF/views/home.jsp 로 바뀐다. 


/Hello/src/main/webapp/WEB-INF/views/home.jsp


 jsp 는 html 을 만들기 위한 템플릿이며 결국은 아래와 같은 HTML 이 동적으로 만들어 진다. ${serverTIme} 이라는 부분이 리턴한 값으로 대체가 된다. 컨트롤러에서 model.addAttribute("serverTime", formattedDate); 에서 모델의 애트리뷰트 이름이 serverTime 이다. 



출처: http://saurus2.tistory.com/entry/Java-Spring-어떻게-동작-하지-Hello-World-의-원리 [개발자 나무 by 미쳐보자]

정렬문제 

 n개의 숫자들이 주어졌을 때 점점 커지는 오름차순이나 내림차순으로 배열하여 출력하는 문제


.출력

입력된 숫자들의 배열이 조건을 만족하도록 다시 나열한 결과


숫자가 점점 커지는 순서=오름차순

숫자가 점점 작아지는 순서=내림차순


ex)오름차순

input: 5,2,4,6,1,3 일때 

출력이 

output1,2,3,4,5,6

이어야 문제가 해결되었다고 볼 수 있음



선택 정렬 알고리즘


선택정렬은 무엇인가?

   선택하여 정렬하는 알고리즘


무엇을 선택할 것인가?

1. 최소값 선택정렬= 오름차순

a.정렬되지않은 숫자중에 가장 작은 숫자를 선택한다.

b.선택한 숫자를 정렬되지 않은숫자들중 첫번째 숫자와 자리를 바꾸면 선택된 숫자는 정렬된 것이다.

c.이과정을 반복한다.


ex) input 5,4,3,2,1일 경우

a단계 정렬되지 않은 숫자 중 가장작은 숫자인 1을 선택 

b.단계 정렬되지 않은 숫자의 첫번째 숫자인 5와 1의 자리를 바꾼다.(14325)

c.단계 2를 선택 해서 4와 변경한다(12345)


정확성 증명

수학적 귀납법을 이용

i번째 선택한 숫자가i번째로 작은 숫자인지 증명


성능분석

주요 함수는 ?

 작은 숫자를 찾기 위한 가장 쉬운 방법은?

비교 함수 n개가 있을때 작은수를 뽑는 방법은n-1 n-1일 때는 n-2 


입력받은 숫자들의 배열이 어떤 형태면 

최악의 경우가 되는가?

최선의 경우가 되는가?

최소만 구하면 되기 때문에 이번의 경우 최악이나 최선은 없다.



2. 최대값 선택정렬= 내림차순



성능분석

1. 어떤 알고리즘이 어떤 문제를 푸는가.

2. 어떤 알고리즘이 내가 처한 문제를 해결하는데 가장 효과적인가.


비용측면, 속도 측면


-특정 기계에서 수행시간을 측정하는 것은 공정하지 못하다.

장비에 따라 성능이 달라지기 때문에


따라서 조건이 동일한 특정기계에서 모든 알고리즘의 수행시간을 측정해야 하는데 이방법은

현실적으로 불가능합니다.



그러므로 수행연산의 횟수를 비교하는 방식으로 성능을 분석합니다.


ex)

안드로이드    10초  곱셈연산을 10번 했다고 생각할수 있음 

pc                1초  0.1초 x 10번 

서버           0.1초  0.01초 x10번


결국 알고리즘을 이용해 문제를 푼다는 것은 기본 함수가 있고 그 함수를 몇번 수행하는가를 구분 할 수 있다.

상대적인 비교!


수행시간은 입력으로 크기가 커지면 커질 수록 시간이 많이 걸린다.

10개의 키를 정렬하는 시간이 100개의 키를 정렬하는 시간보다 길다.


따라서 입력크기 n에 대한 함수로 표현한다.


예를 들면 t(n)



알고리즘 기본연산

1. 산술연산

+,*,-

2. 데이터 입출력

copy,move,save,load 

3. 제어 연산

if,while,register



점근적 표기법

빅오 표기법

상한 


오메가 표기법

     하한

쎄타 표기법

상한과 하한을 모두 정의


+ Recent posts