🪙
Leetcode
  • Content
  • Algorithms
    • Linear Search
    • Binary Search
    • Counting Sort
    • Merge Sort
    • Insertion Sort
    • Selection Sort
  • Array and String
    • Introduction to Array
      • Introduction to Array
      • Introduction to Dynamic Array
      • Find Pivot Index
      • Largest Number At Least Twice of Others
      • Plus One
    • Introduction to 2D Array
      • Introduction to 2D Array
      • Diagonal Traverse
      • Spiral Matrix
      • Pascal's Triangle
    • Introduction to String
      • Introduction to String
      • Immutable String - Problems & Solutions
      • Add binary
      • Implement strStr()
      • Longest Common Prefix
    • Two-Pointer Technique
      • Two-pointer Technique - Scenario I
      • Reverse String
      • Array Partition I
      • Two Sum II - Input array is sorted
      • Two-pointer Technique - Scenario II
      • Remove Element
      • Max Consecutive Ones
      • Minimum Size Subarray Sum
    • Conclusion
      • Array-related Techniques
      • Rotate Array
      • Pascal's Triangle II
      • Reverse Words in a String
      • Reverse Words in a String III
      • Remove Duplicates from Sorted Array
      • Move Zeroes
  • Linked List
    • Singly Linked List
      • Introduction - Singly Linked List
      • Add Operation - Singly Linked List
      • Delete Operation - Singly Linked List
      • Design Linked List
    • Two Pointer Technique
      • Two-Pointer in Linked List
      • Linked List Cycle
      • Linked List Cycle II
      • Intersection of Two Linked Lists
      • Remove Nth Node From End of List
      • Summary - Two-Pointer in Linked List
  • Problems
    • 1. Two Sum
    • 2. Add Two Numbers
    • 7. Reverse Integer
    • 9. Palindrome Number
    • 11. Container With Most Water
    • 12. Integer to Roman
    • 13. Roman to Integer
    • 14. Longest Common Prefix
    • 15. 3Sum
    • 21. Merge Two Sorted Lists
    • 26. Remove Duplicates from Sorted Array
    • 27. Remove Element
    • 28. Find the Index of the First Occurrence in a String
    • 34. Find First and Last Position of Element in Sorted Array
    • 35. Search Insert Position
    • 43. Multiply Strings
    • 49. Group Anagrams
    • 50. Pow(x, n)
    • 54. Spiral Matrix
    • 58. Length of Last Word
    • 66. Plus One
    • 67. Add Binary
    • 69. Sqrt(x)
    • 73. Set Matrix Zeroes
    • 75. Sort Colors
    • 88. Merge Sorted Array
    • 104. Maximum Depth of Binary Tree
    • 121. Best Time to Buy and Sell Stock
    • 122. Best Time to Buy and Sell Stock II
    • 136. Single Number
    • 146. LRU Cache
    • 189. Rotate Array
    • 206. Reverse Linked List
    • 217. Contains Duplicate
    • 219. Cotains Duplicate II
    • 226. Invert Binary Tree
    • 238. Product of Array Except Self
    • 242. Valid Anagram
    • 268. Missing Number
    • 283. Move Zeroes
    • 350. Intersection of Two Arrays II
    • 383. Ransom Note
    • 389. Find the Difference
    • 412. Fizz Buzz
    • 414. Third Maximum Number
    • 445. Add Two Numbers II
    • 448. Find All Numbers Disappeared in an Array
    • 459. Repeated Substring Pattern
    • 485. Max Consecutive Ones
    • 509. Fibonacci Number
    • 637. Average of Levels in Binary Tree
    • 657. Robot Return to Origin
    • 682. Baseball Game
    • 704. Binary Search
    • 705. Design HashSet
    • 709. To Lower Case
    • 724. Find Pivot Index
    • 876. Middle of the Linked List
    • 896. Monotonic Array
    • 860. Lemonade Change
    • 905. Sort Array By Parity
    • 916. Word Subsets
    • 941. Valid Mountain Array
    • 976. Largest Perimeter Triangle
    • 977. Squares of a Sorted Array
    • 1041. Robot Bounded In Circle
    • 1051. Height Checker
    • 1089. Duplicate Zeros
    • 1232. Check If It Is a Straight Line
    • 1275. Find Winner on a Tic Tac Toe Game
    • 1295. Find Numbers with Even Number of Digits
    • 1299. Replace Elements with Greatest Element on Right Side
    • 1342. Number of Steps to Reduce a Number to Zero
    • 1346. Check If N and Its Double Exist
    • 1476. Subrectangle Queries
    • 1480. Running Sum of 1d Array
    • 1491. Average Salary Excluding the Minimum and Maximum Salary
    • 1502. Can Make Arithmetic Progression From Sequence
    • 1523. Count Odd Numbers in an Interval Range
    • 1572. Matrix Diagonal Sum
    • 1672. Richest Customer Wealth
    • 1768. Merge Strings Alternately
    • 1752. Check if Array Is Sorted and Rotated
    • 1769. Minimum Number of Operations to Move All Balls to Each Box
    • 1790. Check if One String Swap Can Make Strings Equal
    • 1800. Maximum Ascending Subarray Sum
    • 1822. Sign of the Product of an Array
    • 1930. Unique Length-3 Palindromic Subsequences
    • 1991. Find the Middle Index in Array
    • 2185. Counting Words With a Given Prefix
    • 2235. Add Two Integers
    • 2236. Root Equals Sum of Children
    • 2270. Number of Ways to Split Array
    • 2381. Shifting Letters II
    • 2559. Count Vowel Strings in Ranges
    • 2610. Convert an Array Into a 2D Array With Conditions
    • 2657. Find the Prefix Common Array of Two Arrays
    • 3042. Count Prefix and Suffix Pairs I
    • 3105. Longest Strictly Increasing or Strictly Decreasing Subarray
    • 3151. Special Array I
    • 3223. Minimum Length of String After Operations
Powered by GitBook
On this page
  • What is Counting Sort?
  • How does Counting Sort Algorithm work?
  • Counting Sort Algorithm
  • Complexity Analysis of Counting Sort:
  • Advantage of Counting Sort:
  • Disadvantage of Counting Sort:

Was this helpful?

Edit on GitHub
  1. Algorithms

Counting Sort

PreviousBinary SearchNextMerge Sort

Last updated 1 year ago

Was this helpful?

What is Counting Sort?

Counting sort bu taqqoslashga asoslanmagan saralash algoritmi bo'lib, u kirish qiymatlarining cheklangan diapazoni mavjud bo'lganda yaxshi ishlaydi. Bu ayniqsa, kirish qiymarlari diapazoni saralanadigan elementlar soniga nisbatan kichik bo'lsa samarali bo'ladi. Counting sortni asosiy g'oyasi kirish massividagi har bir elementning chastotasini hisoblash va bu ma'lumotlardan elementlarni to'g'ri tartiblangan joylarga joylashtirish uchun foydalanishdir.

How does Counting Sort Algorithm work?

Step 1:

  • Berilgan massivdan maksimal elementni toping.

step 1

Step 2:

  • Uzunligi max+1 bo'lgan countArray[] ni barcha elementlari 0 sifatida ishga tushuring. Ushbu massiv kirish massivining elementlarining paydo bo'lishini saqlash uchun ishlatiladi.

Step 3:

  • countArray[] da kirish massivining har bir noyob elementi sonini tegishli indekslarida saqlang.

  • Misol uchun: Kirish massividagi 2 elementining soni 2 ga teng. Demak, countArray[] da 2-indeksda 2 ni saqlang. Xuddi shunday, kirish massividagi 5 elementining soni 1 ga teng, shuning uchun countArray[] da 5-indeksda 1 ni saqlang.

Step 4:

  • Endi countArray[i] = countArray[i - 1] + countArray[i] ni bajarib, countArray[] elementlarining yig'indisi yoki prefiks yig'indisini saqlang. Bu kirish massivining elementlarini chiqish massividagi to'g'ri indeksga joylashtirishga yordam beradi.

Step 5:

  • Kirish massivining oxiridan boshlab takrorlang, chunki kirish massivini oxiridan o'tish teng elementlar tartibini saqlaydi, natijada bu tartiblash algoritmini barqaror qiladi.

  • outputArray[countArray[inputArray[i]]-1] = inputArray[i], outputArrayni yangilang.

  • Shuningdek, countArray[inputArray[i]] = countArray[inputArray[i]]-- countArrayni ham yangilang.

Keling birma bir ko'rib chiqamiz.

Step 6. i = 6 uchun:

  • outputArray[countArray[inputArray[6]]-1] = inputArray[6], outputArrayni yangilang. Shuningdek, countArray[inputArray[6]] = countArray[inputArray[6]]-- countArrayni ham yangilang.

Step 7. i = 5 uchun:

  • outputArray[countArray[inputArray[5]]-1] = inputArray[5], outputArrayni yangilang. Shuningdek, countArray[inputArray[5]] = countArray[inputArray[5]]-- countArrayni ham yangilang.

Step 8. i = 4 uchun:

  • outputArray[countArray[inputArray[4]]-1] = inputArray[4], outputArrayni yangilang. Shuningdek, countArray[inputArray[4]] = countArray[inputArray[4]]-- countArrayni ham yangilang.

Step 9. i = 3 uchun:

  • outputArray[countArray[inputArray[3]]-1] = inputArray[3], outputArrayni yangilang. Shuningdek, countArray[inputArray[3]] = countArray[inputArray[3]]-- countArrayni ham yangilang.

Step 10. i = 2 uchun:

  • outputArray[countArray[inputArray[2]]-1] = inputArray[2], outputArrayni yangilang. Shuningdek, countArray[inputArray[2]] = countArray[inputArray[2]]-- countArrayni ham yangilang.

Step 11. i = 1 uchun:

  • outputArray[countArray[inputArray[1]]-1] = inputArray[1], outputArrayni yangilang. Shuningdek, countArray[inputArray[1]] = countArray[inputArray[1]]-- countArrayni ham yangilang.

Step 12. i = 0 uchun:

  • outputArray[countArray[inputArray[0]]-1] = inputArray[0], outputArrayni yangilang. Shuningdek, countArray[inputArray[0]] = countArray[inputArray[0]]-- countArrayni ham yangilang.

Counting Sort Algorithm

  • max(inputArray[])+1 oÊ»lchamdagi countArray[] yordamchi massivini eʼlon qiling va uni 0 bilan ishga tushiring.

  • inputArray[] massivini aylantiring va inputArray[] ning har bir elementini countArray[] massivi indeksi sifatida ko'rsating, ya'ni 0 <= i < N uchun countArray[inputArray[i]]++ ni bajaring.

  • inputArray[] massivining har bir indeksidagi prefiks summasini hisoblang.

  • N o'lchamdagi outputArray[] massivi yarating.

  • inputArray[] qatorini oxiridan aylantiring va outputArray[countArray[inputArra[i]]-1] = inputArray[i] ni yangilang. Shuningdek, countArray[inputArray[i]] = countArray[inputArray[i]]-- ni yangilang.

Quyida yuqoridagi algoritmni amalga oshirish ko'rsatilgan:

func countingSort(nums []int) []int {

    // Massivdan maksimal elementni topish uchun dastlab birinchi elementni max deb olamiz
    max := nums[0]

    // Massivni aylantirib, massivning maksimal elementini topamiz
    for _, num := range nums {
        if num > max {
            max = num
        }
    }

    // Massiv uzunligi max+1 bo'lgan countArray yaratamiz
    countArray := make([]int, max+1)

    // Massivni aylantirib, countArray elementlarini hisoblaymiz
    for _, num := range nums {
        countArray[num]++
    }

    // countArray elementlarining prefiks summasini hisoblaymiz
    for i := 1; i < len(countArray); i++ {
        countArray[i] += countArray[i-1]
    }

    // N o'lchamdagi outputArray yaratamiz
    outputArray := make([]int, len(nums))

    // inputArray qatorini oxiridan aylantiramiz va outputArray elementlarini joylashtiramiz
    for i := len(nums) - 1; i >= 0; i-- {
        outputArray[countArray[nums[i]]-1] = nums[i]
        countArray[nums[i]]--
    }

    return outputArray  
}

Complexity Analysis of Counting Sort:

  • Time Complexity O(N+K), bu yerda N - massiv uzunligi, K - massivning maksimal elementi.

    • Best Case: O(N+K)

    • Average Case: O(N+K)

    • Worst Case: O(N+K)

  • Space Complexity: O(N+K), bu yerda N - massiv uzunligi, K - massivning maksimal elementi.

Advantage of Counting Sort:

  • Counting sort agar kiritish diapazoni kirish soniga teng bo'lsa, odatda merge sort, quick sort kabi barcha taqqoslashga asoslangan tartiblash algoritmlariga qaraganda tezroq ishlaydi.

  • Counting sortni kodlash oson

  • Counting sort barqaror algoritmdir.

Disadvantage of Counting Sort:

  • Counting sort decimal qiymatlarda ishlamaydi.

  • Saralash kerak bo'lgan qiymatlar oralig'i juda katta bo'lsa, counting sort samarasiz bo'ladi.

step 2
step 3
step 4
step 5
step 6. i = 6
step 7. i = 5
step 8. i = 4
step 9. i = 3
step 10. i = 2
step 11. i = 1
step 12. i = 0

Kodni ishlatib ko'rish uchun dan foydalaning.

Counting sort joyida tartiblash() algoritmi emas, u massiv elementlarini saralash uchun qo'shimcha joydan foydalanadi.

Source:

playground
in-place
GeeksforGeeks