国家はいかなる場合でも領域内において十全に統治権を行使できるというわけではなく、行政能力の不足などによって統治の行き届かない場合もある。このような国家は治安維持能力や行政サービス能力が低いため、国民に十分な治安や医療などを提供できない。こうした国家は「失敗国家」と呼ばれ、ひどい場合は暴力の独占を保つことができず、国土の各所に軍閥が割拠して内戦が勃発する。さらにこれが進行すると1991年以降のソマリアのように中央政府そのものが事実上崩壊し、無政府状態となる例も存在する。
社会学における国家の定義は法学や政治学とは異なり、国家の権力の中身ではなく、あくまでその形式のほうに向けられている。社会学的な国家（ここでは近代国家）の定義でもっとも代表的なものがマックス・ウェーバーによるものである。ウェーバーは二つの側面から国家を理解していた。第一には、警察や軍隊などの暴力手段を合法的に独占していること、そして第二には、官僚や議員など統治組織の維持そのものを職業として生計を立てる専門家によって構成されている政治的共同体であるということである。この定義を詳しく見ると、以下のようにまとめることができる。（1）中世のヨーロッパでは、国家は軍事組織をほとんど独占しておらず、戦争は貴族の私兵や傭兵隊などによって賄われるのが通例であり、国家が直接的に訓練・組織化に関わることは少なかった。しかし、17世紀以降の絶対王政と国家間戦争の激化により、王国に排他的な忠誠を誓う「常備軍」を整備しはじめ、次第に底辺の家族や村落の中にまで徴税や徴兵の権力が介入していくようになる。それに伴って、国家に動員される民衆の間には自ずと政治意識や権利意識も生じ始め、国家の利益を直接的に代表するのは世襲身分による王家や貴族ではなく、われわれ平等な「国民」であるという理解が次第に形成され、これが18世紀末以降に革命を帰結させていくことになる。「国民」意識が教育制度などを通じて浸透するようになると、もはや国家が直接的な強制力を行使して兵士を徴収する徴兵制よりも、二次大戦以降には「国民」の中から志願兵を募るという方向へと転換し、軍隊はより一層「専門化」していくことになる。（2）中世以前の国家は、国王と臣下、領主、都市国家、地域共同体といった様々な中間集団との重層的な関係の中にあり、国家は家族・親族の領域と未分化の状態であった。しかし、戦争の規模の拡大と市場経済化および産業化の波は、国家と個人の直接的な関係と社会の均質的画一化を推し進めるものであり、これらに対応するためには、国家を統一的に運営するためのルール（法律）と、専門的な職業家（官僚・議員）を必要とするようになった。こうして、国家が統治組織として専門分化することにより、統治される対象としての「社会（市民社会）」が自律的な領域として分化していくことになる。近年は、強力な官僚制と「物理的暴力の独占」を強調するというウェーバーの議論に対して、そもそも国家はそのように堅固な統一性をもった統治組織なのではなく、民意や社会の変動の前に不安定で不統一的なものであるという説明がなされることもある。現代社会を批評する議論の中には、国民国家が既に無意味になってしまったかのように語られることもあるが、社会学の国家論ではほとんど否定されている。
バケットソートには、大きく分けて2種類の実装がある。まずひとつは、可変個の要素を保持できるデータ構造を使ってバケツを表現する方法である。簡単な例としては、m個の線形リストを使う実装が考えられる。直感的に理解しやすい実装だが、単純な配列だけではなく可変長のデータ構造が必要になるため、可変長のデータ構造がない言語の場合、その実装コストを考慮しておく必要がある。もうひとつは、いったん整列対象のデータを走査して値ごとの出現回数を数えておき、それに応じてひとつの配列の中を値ごとに分割する方法である。 この実装によるバケットソートのみを指して特に分布数えソート、計数ソート(Counting Sort)などと言う。たとえば以下の入力が与えられたとする。3 2 2 1 2 2 1 3 3 1 2 3昇順にソートした結果は以下のようになるはずである。1 1 1 2 2 2 2 2 3 3 3 3さて値ごとの出現分布を調べると、1が3個、2が5個、3が4個出現していることがわかる（ソートしなくても元のデータ列に一通りアクセスすればわかる）。出現個数がわかれば、1は結果列の1番から、2は4番から、3は9番から始まることがわかる。Javaによるサンプルコードは以下のようになる。/** * 配列 src 内をバケットソートして配列 dst にコピーする。 * @param src   ソート対象となるデータの配列。 * @param dst   ソート結果を書き込む配列。 * @param len   ソート対象となるデータの個数。src および dst の長さ以下であること。 * @param range とり得る値の範囲。対象の各データは 0 以上 range 未満の値をとる。 */public static void bucketsort(int[] src, int[] dst, int len, int range) {    /** 値ごとの出現回数 */    int[] count = new int[range];    /** ソート後配列における値ごとの開始位置 */    int[] offset = new int[range];    /** ループ制御用 */    int i;    /* 出現回数を数える */     for (i = 0; i < len; i++) {        count[ src[i] ]++;    }    /* 開始位置計算 */    offset[0] = 0;    for (i = 1; i < range; i++) {        offset[i] = offset[i-1] + count[i-1];    }    /* ソート処理 */    for (i = 0; i < len; i++) {        int target = src[i];        dst[ offset[target] ] = target;        offset[target]++;    }}