web-dev-qa-db-ja.com

単一のループで配列を並べ替える方法は?

そのため、さまざまな並べ替えアルゴリズムを使用していました。ただし、ほとんどすべての並べ替えアルゴリズムでは、配列を並べ替えるために2つのループが必要です。バブルソートと挿入ソートの時間計算量は、ベストケースではO(n)ですが、ワーストケースではO(n ^ 2)であり、2つのループが必要です。ソートする方法はありますか?単一ループの配列?

5
Aishwarya R

ここでは、Pythonでの単一ループのバブルソート:

def bubbly_sortish(data):
    for _ in xrange(len(data)**2):
        i, j = _/len(data), _%len(data)
        if i<j and data[i] > data[j]:
            data[i], data[j] = data[j], data[i]

A = [5, 1, 2, 3, 5, 6, 10]
bubbly_sortish(A)

print A            

もちろん、これは冗談です。しかし、これは、ループの数がアルゴリズムの複雑さとはほとんど関係がないことを示しています。

さて、O(n)比較、いいえ、 不可能 で配列をソートできるかどうかを尋ねている場合。下限はΩ( n log n)比較ベースのソートアルゴリズム用。

7
Juan Lopes

一般的なケースでは、平均としてO(n lg n)があります。

ただし、特定のケースでは、O(n)が最適です。これは、実装でforキーワードのインスタンスが複数表示される場合でも、「1つのループのみ」と呼ぶものに十分近いと思います。 。そして、それに関する良いニュースは、あなたがあなたの最良のケースを実現するために運に依存していないということです。データに関するいくつかのプロパティを知っている場合は、いくつかの特定のアルゴリズムを選択できます。例えば ​​:

  • 3方向クイックソートは、O(n)のすぐ近くで実行されます。これは、いくつかの個別の並べ替えキーしかないアイテムが多数ある場合です(サーバーログエントリをアイテム、日付をキーと考えてください)。
  • キーが簡単にインデックス付け可能であり(文字セットや小さな整数など)、インデックスに既知の上限kがある場合、カウントソートはO(n + k)で実行されます。
  • 最大長wの文字列を処理している場合、BurstsortはO(wn)で実行されます。

これらは3つの例にすぎません。多くの種類の制約されたデータセットについて、頭のてっぺんから思い出すにはあまりにも多くの方法があります。 O(n lg n)が十分ではない実際のケースがある場合は、適切な調査を行う価値がありますデータ内にいくつかの興味深いプロパティを特定した場合

2
Mathias Dolidon

C++を使用したシングルループバブルソート

int a[7]={5,7,6,2,4,3,1};

int temp = 0;

int j = 0;

for(int i = 0 ; i<a[]-1 ; i++)
{
    int flag = 0;
    if(a[i]>a[i+1])
    {
        temp = a[i];
        a[i] = a[i+1];
        a[i+1] = temp;
        flag = 1;
    }       
    if(i == 7-2-j)
    {
        if(!flag) break;
        i = -1;
        j++;
    }
}
2
Ari4
int list[] = { 45, 78, 22, 96, 10, 87, 68, 2 };
    for (int i = 1; i < list.length; i++) {
        if (list[i] < list[i - 1]) {
            list[i] = list[i] + list[i - 1];
            list[i - 1] = list[i] - list[i - 1];
            list[i] = list[i] - list[i - 1];
            i = 0;
        }
    }
    System.out.print("Sorted array is : ");
    for (int i = 0; i < list.length; i++) {
        System.out.print(list[i] + " ");
    }
2

与えられた例の作業バージョンは次のとおりです。

ソートする値の範囲がわかっている場合、問題を実行する非常に高速で効率的で論理的な方法の1つが機能します。たとえば、0 <= val <= 100ここで、valは整数です。

次に、2つのループだけで1回の読み取りと書き込み操作でそれを行うことができます... 1つは配列の読み取り用、もう1つはソートされた配列の書き込み用です。

インデックスが値0〜100を表す2番目の配列を使用し、すべての値0〜100が検出された回数を格納します(例:val = 100ターゲットアレイに234回存在する可能性があります。

読み取り用と書き込み用のループは1つだけです。これは、読み取りと書き込みの両方を実行する1つのループと同じくらい計算効率が高く、比較を使用するループよりも高速です...主張する場合は、ターゲット配列の長さの2倍の長さの単一ループで、新しい配列の書き込み操作でi値をゼロにリセットします。

2番目のループは、最初の配列で検出されたすべての値のカウントを順番に書き込むだけです。

1
com.prehensible

単一ループ配列ソート:

for(int i = 0, j=i+1; i < arr.length && j<arr.length;)
    {       
        if(arr[i] > arr[j])
        {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;              
            i=0;
            j=i+1;
        } 
        else
        {
            i++;
            j++;
        }
    }
1
Anil Mule

次のコードはphpにあります。コードは https://paiza.io/projects/4pAp6CuB-e9vhGIblDNCZQでテストできます。

  $a = [8,3,4,9,1];
    for($i=0;$i<count($a)-1;$i++){
        if($a[$i] > $a[$i+1]){
            $temp = $a[$i];
            $a[$i] = $a[$i+1];
            $a[$i+1] = $temp;
            $i = -1;
        }
    }
    print_r($a);
1
puneet jain

これは、単一のループのみを使用して配列をソートするコードです。

var array = [100, 110, 111, 1, 3, 19, 1, 11, -10]
var i = 1

while i < array.count - 1 {
    if array[i] > array[i + 1] {
        let temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
        i = -1;
    }
    i = i + 1;
}
print(array)
1
Jatin Chauhan
javascript:
function bruteForce(arr){
    for(var i=0;i<arr.length; ){
        if(arr[i+1]< arr[i]){
            var temp = arr[i];
            arr[i]=arr[i+1];
            arr[i+1] = temp;
            i--;
            if(i === -1) i=0;
        }else i++;
    }

    return  arr;
 }

alert(bruteForce([2,3,4,5,6,23,1,1]));

コードをコピーしてブラウザのURLに貼り付け、Enterキーを押します。 javascript:が欠落しているので、それを追加します。

1
shakthi nagaraj
public void sortArrayUsingSingleLoop(int[] intArray) {
        int temp;
        boolean swap = false;
        for(int i=0;i<intArray.length-1;i++){
         if(intArray[i]>intArray[i+1]){
             temp=intArray[i];
             intArray[i]=intArray[i+1];
             intArray[i+1]=temp;
             swap=true;
         }

         if(swap &&i==intArray.length-2){
            i=-1;swap=false;
         }
        }

    }
1
public int find2ndLargest() {
    int[] arr = {1,3,14,25,7,20,11,30};
    int temp;

    // sort array
    for (int i=0;i<arr.length-1;i++) {
        if (arr[i]>arr[i+1]) {
            temp = arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=temp;
            i=0;
        }
    }
    return arr[arr.length-2];
}
0
Ritika Jaggi

次のコードはPHPで、可能な限り最良の場合に配列をソートします。https:// paiza .io/projects/r22X0VuHvPQ236jgkataxg

<?php
function quicksort($a){
    $n = count($a);
    $lt = [];
    $gt = [];

    if($n < 2){
       return $a;
    }else{
        $f = $a[0];
    }

    for($i = 1;$i < $n ;$i++){
        if($a[$i] > $f){
            $gt [] = $a[$i];
        }else{
            $lt [] = $a[$i];
        }
    }

    return array_merge(quicksort($lt),array($f),quicksort($gt));
}


$ar = [7,4,3,6,5,1,2];
echo "Input array => ".implode(' , ',$ar).'<br>';
$a = quicksort($ar);

echo "Output array => ".implode(' , ',$a);;

?>
0
puneet jain

パブリッククラスSinleLoopeSorting {

public static void main(String[] args) {
    Integer[] x = new Integer[] { 1, 7, 8, 0, 4, 2, 3 };

    for (int i = 0; i < x.length - 1; i++) {
        if (x[i] > x[i + 1]) {
            int p = x[i];
            x[i] = x[i + 1];
            x[i + 1] = p;
            i = -1;
        }
    }
    for (int i = 0; i < x.length; i++) {
        System.out.println(x[i]);
    }
}

}

0
Manoj Verma

シングルループを使用した配列の並べ替え(javascript)

var arr = [4,5,2,10,3,7,11,5,1];
for(var i = 1; i < arr.length; i++)
{       
    if(arr[i] < arr[i-1])
    {
        arr[i] = arr[i] + arr[i-1];
        arr[i-1] = arr[i] - arr[i-1]; 
        arr[i] = arr[i] - arr[i-1];              
        i=0;
    } 
}

出力:arr = [1、2、3、4、5、5、7、10、11]

0
Sk Asif

パーティーに遅れますが、これが役立つことを願っています

Javaソリューション

for(int i=1;i< arr.length;i++) {
        if(arr[i] < arr[i-1] ){
            arr[i-1] += arr[i];
            arr[i] = arr[i-1] - arr[i];
            arr[i-1] -= arr[i];
            i=0;
        }
}

シングルループでJavaを使用して配列を並べ替える:

    public int[] getSortedArrayInOneLoop(int[] arr) {

    int temp;
    int j;

        for (int i = 1; i < arr.length; i++) {
        j = i - 1;

            if (arr[i] < arr[j]) {

            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
            i = 1;

            }

        }

    return arr;

    }
0
Amit Kumar
static int[] sort(int[] arr){
        int idx = 0;
        int len = arr.length - 1;
        int counter = len;
        while(true){
            if(idx != len && arr[idx] > arr[idx+1]){
                swap(arr, idx, idx + 1);
                counter--;
            }
            idx++;
            if(counter == len && idx == len){
                break;
            }
            if(idx == len){
                idx = 0;
                counter = len;
            }
        }
        return arr;
    }


    void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
0
Abay Gabdullin

pythonの場合:

def sort(array):
    n = len(array);
    i = 0;
    mod = 0;
    if(len(array)<= 1):
        return(array)

    while n-1:
        if array[mod] > array[mod+1]:
            array[mod], array[mod+1] = array[mod+1], array[mod]

        mod+=1
        if mod+1 >= n:
            n-=1
            mod = 0

    return array
0
Saeed Dehqan
def my_sort(num_list):
    x = 0
    while x < len(num_list) - 1:
        if num_list[x] > num_list[x+1]:
            num_list[x], num_list[x+1] = num_list[x+1], num_list[x]
            x = -1
        x += 1
    return num_list

print(my_sort(num_list=[14, 46, 43, 27, 57, 42, 45, 21, 70]))
#output [14, 21, 27, 42, 43, 45, 46, 57, 70]
0
Om trivedi

挿入ソート用の単一のforループ:

強いテキスト

function insertionSort (array) {
    for(var i = 1 ; i < array.length ;){
        if(array[1] < array[0]) {
                temp = array[i];
                array[i] = array[i -1];
                array[i -1] = temp; 
         }
        if(array[i] < array[i-1]){
            var temp = array[i]
            array[i] = array[i -1]
            array[i -1] = temp
            i--
        } else{i++}
    }
    return array
}
0
Vaibhav Namburi
    #include<stdio.h>

    void sort(int a[],int n,int k,int w)
    {   
      int i,j,z,key;
      n=n-1;
      j = k+1;
      key = a[j];
      i = j-1;
      while(i>0 && a[i]>key)
      {
        a[i+1] = a[i];
        i = i-1;
      }
      a[i+1] = key;
      k = k + 1;
      if(n!=0)
      {
       sort(a,n,k,w);
      }
    }

  int main()
 {
    int i,n,w,k=1,z=5,g;
    printf("enter the size of an array\n");
    scanf("%d",&n);
    g=n;
    int a[n];
    for(i=1;i<=n;i++)
    {
        scanf("%d", &a[i]);
    }
    w = n;
    sort(a,n-1,k,w);

    for(i = 1; i <= n; i++)
    {
        printf("%d", a[i]);
    }
 }

これが解決策です。これはあなたを助けるかもしれません。

0
jay thakkar