Сортировка массива через стек - C#
Формулировка задачи:
Всем доброго времени суток!!
Подскажите, пожалуйста, как мне отсортировать массив через стек, т.е. есть код как пользоваться стек, там же есть сортировка массива, но мне нужно совершенно другая сортировка. Я просто вообще не понимаю как сортируется массив в стеке.
Пример сортировки в стеке
Вот моя сортировка массива, по алгоритму Шелла:
Помогите пожалуйста
using System;
using System.Collections.Generic;
using System.Text;
namespace StackSort {
class Program {
static void SortCompareAndPush<T>(Stack<T> stack, ref T item)
where T: IComparable<T> {
if (stack.Count > 0) { // if(!stack.IsEmpty) {
do {
T next_item = stack.Pop();
if (item.CompareTo(next_item) == 1) { // if(item > next_item) {
T temp = item;
item = next_item;
next_item = temp;
}
SortCompareAndPush<T>(stack, ref next_item);
} while (item.CompareTo(stack.Peek()) == 1); // } while(item > stack.Top);
}
stack.Push(item);
}
static void SortStack<T>(Stack<T> stack)
where T : IComparable<T> {
if (stack.Count > 1) { // if(!stack.IsEmpty) {
T item = stack.Pop();
SortCompareAndPush<T>(stack, ref item);
}
}
static void PrintStack<T>(Stack<T> stack) {
foreach (T item in stack) {
Console.WriteLine(item);
}
}
static void Main(string[] args) {
Stack<int> stack = new Stack<int>();
Random rnd = new Random();
for (int i = 0; i < 20; ++i)
stack.Push(rnd.Next(100));
Console.WriteLine("Initial stack:");
PrintStack<int>(stack);
SortStack<int>(stack);
Console.WriteLine("Sorted stack:");
PrintStack<int>(stack);
Console.ReadKey();
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace AlgoritmShella
{
class Program
{
static void Main(string[] args)
{
Random rdn = new Random();
int n = 1000;
int[] mas = new int[n];
for (int i = 1; i < n; i++)
{
mas[i] = rdn.Next(1, 1000);
}
Console.WriteLine("Массив:");
Console.WriteLine("------------------------------------------");
for (int i = 1; i < n; i++)
{
Console.WriteLine(mas[i]);
}
Console.WriteLine("------------------------------------------");
int tmp;
int j;
Console.WriteLine("Сортировка:");
Console.WriteLine("------------------------------------------");
int step = n / 2;//инициализируем шаг.
while (step > 0)//пока шаг не 0
{
for (int i = 0; i < (n - step); i++)
{
j = i;
while (j >= 0 && mas[j] > mas[j + step])
{
int temp = mas[j];
mas[j] = mas[j + step];
mas[j + step] = temp;
j--;
}
}
step = step / 2;
}
Console.WriteLine("------------------------------------------");
Console.WriteLine("Вывод:");
wr.WriteLine("Вывод:\n");
for (int i = 1; i < n; i++ )
{
Console.WriteLine("mas[{0}] = {1}", i, mas[i]);
}
Console.ReadKey();
}
}
}
Проще говоря, как мне запихнуть весь массив в стек и отсортировать его по нужному алгоритму, я просто не понимаю как это сделать.
Решение задачи: «Сортировка массива через стек»
textual
Листинг программы
static void SortStack(Stack<int> stack) {
int n = stack.Count;
int step = n / 2;
int j;
while (step > 0) {
for (int i = 0; i < (n - step); i++) {
j = i;
while (j >= 0 && stack.ElementAt(j) > stack.ElementAt(j + step)) {
int temp = stack.ElementAt(j);
SetStackItem(stack, j, stack.ElementAt(j + step));
SetStackItem(stack, j + step, temp);
j--;
}
}
step /= 2;
}
}
static void SetStackItem(Stack<int> stack, int index, int value) {
Stack<int> items = new Stack<int>();
int length = stack.Count;
index = length - index;
for (int i = 0; i < length - index; i++)
items.Push(stack.Pop());
stack.Pop();
stack.Push(value);
for (int i = 0; i < length - index; i++)
stack.Push(items.Pop());
}