A.選択ソート
1.基本原則
假设要按升序排列一个数列。选择排序法先找到数列中最小的数,然后将它和第一个元素交换。接下来,在剩下的数中找到最小数,将它和第二个元素交换,依此类推,直到数列中仅剩一个数为止。
2.注文プロセス
配列{49,38,65,97,76,13,27,49}例:
第一次 : [13, 38, 65, 97, 76, 49, 27, 49]
第二次 : [13, 27, 65, 97, 76, 49, 38, 49]
第三次 : [13, 27, 38, 97, 76, 49, 65, 49]
第四次 : [13, 27, 38, 49, 76, 97, 65, 49]
第五次 : [13, 27, 38, 49, 49, 97, 65, 76]
第六次 : [13, 27, 38, 49, 49, 65, 97, 76]
第七次 : [13, 27, 38, 49, 49, 65, 76, 97]
3.複雑
Oの選択ソートの時間計算量(N ^ 2)。
チェックする最初のn個の要素が、Nをチェックするための要素のその後数 - 1、N - 2、...、2及び1。各検査1/2 * nは、時刻n * 1/2 *を実行しているので、N、単純なO(N ^ 2)を書き込むの要素の平均数。
4.JAVAは、以下のことを実現します:
class selectSort{
public static void main(String[]args){
int[] arr={49,38,65,97,76,13,27,49};
for(int i=0;i<arr.length-1;i++){ //-1是因为没有必要进行最后一个数
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
swap(arr,i,j);//即用即释放
}
}
}
show(arr);
}
public static void swap(int []arr,int i,int j ){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void show(int[]arr){
String s="[";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i]+"]";
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
出力:
[13, 27, 38, 49, 49, 65, 76, 97]
II。バブルソート
1.原理:
对比相邻的元素值,如果满足前一个元素值小于后一个元素值就交换元素值,把较小的元素移动到数组的前面(从小到大排序),把大的元素移动到数组的后面,即交换两个元素的位置,这样较小的元素就像气泡一样一直从底部上升到顶部。
2.注文プロセス
例として、配列[5,2,4,6,1,3]。
第一次:[2,4,5,1,3,6]
第二次:[2,4,1,3,5,6]
第三次:[2,1,3,4,5,6]
第四次:[1,2,3,4,5,6]
アルゴリズムを実装3.
バブルアルゴリズム二サイクル、最後のサイクルのみ1つの配列要素から、配列の長さから1を引いたものをソートするために、通常、選別ラウンドを制御するための前記外側ループ、無コントラスト、ソートが完了してきたが。主内側ループを低減ラウンドの選別の交換回数との比較が交換位置か否かを決定するために、アレイ内の各要素の大きさ、及び比較隣接しています。
4.JAVAは、以下のことを実現します:
class bubbleSort{
public static void main(String[]args){
int[] arr={5,2,4,6,1,3};
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
swap(arr,j,j+1);
}
}
}
show(arr);
}
public static void swap(int[]arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void show(int [] arr){
String s="[";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i]+"]";
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
出力:
[1,2,3,4,5,6]
III。挿入ソート
[6,4,7,5] 1.としては、挿入ソートを説明します
ソート挿入を説明するために6,4、7,5の例を使用します。
それはソート挿入をできなくなります。この時に、第1には、フロントがなかったので、ソート、まず、第1のデータ6,6を見つける最初の挿入であるので、最初の結果は6,4,7,5
この場合、データの第2のソート順に挿入される6,4,7,5であり、そして第2のデータは、この時点で、次いで、データを入れて4以前に配置された配列を比較し、4である開始します行6は、6の前方に移動するので、この時点で結果は4、6う4が6未満であるので、それはケース4になり、したがって、この場合には4と6を比較すると、良好なデータであり、 5
図7は、この時点で第3のデータと注文データが4,6,7,5となっており、図7は、先に配置された配列され、この時間を比較すると、優れたデータ列である4 、6、7、まず、良好な比(第一それよりなぜ6,7、なぜなら4,6が既にソートされているので、図7及び大6は、その後4及び比較より6の前方には必要がない場合、この時点でA)、及び、比較の際に見つかった、6 7よりも大きいので、この場合には変更する必要があるので、この時点での結果は4,6,7,5でありません
その後、第四のデータは5であり、このデータの時系列は4,6,7,5になり、5、良好なデータ列4を持って、6を比較して、第5,7ました比(なぜ5およびので、この時点で最初のそれよりも7,5及び7よりも大きいが、その後、あなたが必要としない場合と4,6,7がすでにソート良いのであるため、6と比較し4の前に)、そして5比較及び7,5小さなとして7の後ので、この場合のシーケンスは4,6,5,7、5及び6で、次いで5~6時間として比較されるので、この場合のシーケンスは4,5,6,7であり、図4及び図5は、4,5,6,7の順、が大きいため5〜4の場合、比較であります
2.JAVAは、以下のことを実現します:
class insertSort{
public static void main(String[]args){
int [] arr={6,4,7,5};
int e;
int j;
for(int i=1;i<arr.length;i++){
e=arr[i];
for(j=i;j>0&&arr[j-1]>e;j--){ //指针j从第二位数开始即j>0
arr[j]=arr[j-1];
}
arr[j]=e;
}
show(arr);
}
public static void swap(int []arr,int i,int j ){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void show(int[]arr){
String s="[";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i]+"]";
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
出力:
[4,5,6,7]
IV。カウンティングソート
1.基本原則
2.JAVAは、以下のことを実現します:
class countSort{
public static void main(String[]args){
int[] arr={8,5,9,2,7,4,6,1,3,10,-3,-2,-10};
int min=arr[0];
int max=arr[0];
for(int i=0;i<arr.length;i++){ //O(n)
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<min){
min=arr[i];
}
}
int[] nums=new int[max-min+1];
int offset=min;
for(int i=0;i<arr.length;i++){ //O(n)
nums[arr[i]-offset]++;
}
int index=0;
for(int i=0;i<nums.length;i++){ //O(m)
if(nums[i]!=0){
for(int j=0;j<nums[i];j++){
arr[index++]=i+offset;
}
}
}
show(arr);
}
public static void swap(int []arr,int i,int j ){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void show(int[]arr){
String s="[";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i]+"]";
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
出力:
[-10,-3,-2,1,2,3,4,5,6,7,8,9,10]
要約:
- 代替的に、泡は、挿入ソートの3つは、データの大小関係に従って順序付け比較され
- ソート整数のみのために関係なく、種類の大きさのデータ自体の特性と比較される浴槽計数ベース
- それは時間のために犠牲スペースの典型的なものです